React-native: [Android] Kesalahan: Sumber daya duplikat

Dibuat pada 10 Nov 2018  ·  103Komentar  ·  Sumber: facebook/react-native

Lingkungan Hidup

Info Lingkungan Asli React:

System:
  OS: macOS 10.14
  CPU: (4) x64 Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz
  Memory: 103.10 MB / 8.00 GB
  Shell: 3.2.57 - /bin/bash
Binaries:
  Node: 8.12.0 - /usr/local/bin/node
  Yarn: 1.0.1 - /usr/local/bin/yarn
  npm: 6.4.1 - /usr/local/bin/npm
  Watchman: 4.7.0 - /usr/local/bin/watchman
SDKs:
  iOS SDK:
    Platforms: iOS 12.1, macOS 10.14, tvOS 12.1, watchOS 5.1
  Android SDK:
    API Levels: 16, 17, 19, 21, 23, 24, 25, 26, 27, 28
    Build Tools: 19.1.0, 20.0.0, 23.0.1, 23.0.2, 23.0.3, 25.0.0, 25.0.1, 25.0.2, 25.0.3, 26.0.0, 26.0.1, 26.0.2, 26.0.3, 27.0.0, 27.0.1, 27.0.3, 28.0.0, 28.0.0, 28.0.2, 28.0.3
    System Images: android-16 | ARM EABI v7a, android-16 | MIPS, android-16 | Intel x86 Atom, android-16 | Google APIs Intel x86 Atom, android-19 | Google APIs Intel x86 Atom, android-24 | Google Play Intel x86 Atom, android-26 | Google APIs Intel x86 Atom, android-26 | Google APIs Intel x86 Atom_64, android-26 | Google Play Intel x86 Atom, android-27 | Google Play Intel x86 Atom, android-28 | Google APIs Intel x86 Atom, android-P | Google APIs Intel x86 Atom, android-P | Google Play Intel x86 Atom
IDEs:
  Android Studio: 3.2 AI-181.5540.7.32.5056338
  Xcode: 10.1/10B61 - /usr/bin/xcodebuild
npmPackages:
  react: 16.6.0-alpha.8af6728 => 16.6.0-alpha.8af6728 
  react-native: 0.57.4 => 0.57.4 
npmGlobalPackages:
  babel-preset-react-native: 4.0.0
  react-native-cli: 2.0.1
  react-native-create-library: 3.1.2
  react-native-git-upgrade: 0.2.7

Deskripsi

Saya tidak dapat membuat apk rilis dengan gambar PNG di Android. Tetapi dapat membuat apk rilis jika tidak ada gambar PNG di dalamnya. Inilah kesalahan yang saya dapatkan saat membuat build rilis

[drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/src/main/res/drawable-mdpi/assets_mario.png [drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/build/generated/res/react/release/drawable-mdpi-v4/assets_mario.png: Error: Duplicate resources
:app:mergeReleaseResources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mergeReleaseResources'.
> [drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/src/main/res/drawable-mdpi/assets_mario.png   [drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/build/generated/res/react/release/drawable-mdpi-v4/assets_mario.png: Error: Duplicate resources

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Demo yang Dapat Direproduksi

  1. Buat aplikasi - react-native init demo
  2. Buat folder assets di folder root proyek.
  3. Tambahkan gambar PNG di dalam folder aset.
  4. Sekarang implementasikan komponen image dengan gambar PNG di atas.
  5. Sekarang bundel menggunakan cmd
    react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
  6. Kemudian buat rilis apk menggunakan Generate Signed APK
Bug Android

Komentar yang paling membantu

Jawaban Mapsy akan membantu https://stackoverflow.com/a/52750886
Jadi pada dasarnya Anda mengedit file /node_modules/react-native/react.gradle
dan tambahkan doLast tepat setelah blok doFirst , secara manual.

doFirst { ... }
doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
            ant.move(file: originalDir, tofile: destDir);
        }
    }
    moveFunc.curry("ldpi").call()
    moveFunc.curry("mdpi").call()
    moveFunc.curry("hdpi").call()
    moveFunc.curry("xhdpi").call()
    moveFunc.curry("xxhdpi").call()
    moveFunc.curry("xxxhdpi").call()
}

Semua 103 komentar

periksa https://github.com/facebook/react-native/issues/19239#issuecomment -414564404 ini

Anda perlu menghapus gambar folder drawable jika ada?

@ ZeroCool00 tidak akan mempengaruhi gambar di Android?

Jawaban Mapsy akan membantu https://stackoverflow.com/a/52750886
Jadi pada dasarnya Anda mengedit file /node_modules/react-native/react.gradle
dan tambahkan doLast tepat setelah blok doFirst , secara manual.

doFirst { ... }
doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
            ant.move(file: originalDir, tofile: destDir);
        }
    }
    moveFunc.curry("ldpi").call()
    moveFunc.curry("mdpi").call()
    moveFunc.curry("hdpi").call()
    moveFunc.curry("xhdpi").call()
    moveFunc.curry("xxhdpi").call()
    moveFunc.curry("xxxhdpi").call()
}

@ ZeroCool00 @mkchx Saya memeriksa dengan kedua jawaban Anda, itu berfungsi. Terima kasih banyak guys :)

Hai semua, bagaimana kita bisa menyelesaikan ini dengan pekerjaan jenkins. Karena itu akan selalu melakukan npm install yang menimpa perubahan ini pada file react.gradle. Kita dapat membuat build di studio android untuk android tetapi tidak memungkinkan di jenkins.

Hai @ vivek-walecha-657 Saya belum mencoba ini, tetapi Anda dapat mencoba perintah ini untuk membuat bundling offline

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle

@jeffreyrajanofficial Thanx untuk menulis, solusi yang Anda berikan akan membantu jika kita pergi dan mengubah file react.gradle. Tetapi saya tidak ingin membuat rilis dengan mengubah file react.gradle setiap kali saya menginstal npm di mana-mana.

@jeffreyrajanofficial Bisakah Anda memberi tahu versi mana (terbaru lebih rendah dari ini atau lebih tinggi dari ini) yang berfungsi dengan baik, tanpa masalah ini. Karena catatan rilis tidak memberi tahu apa pun bahwa masalah ini telah diselesaikan.

Semuanya diurutkan sekarang di RN> 57 file react.gradle secara otomatis membuat bundel.
untuk membuat rilis build, Anda tidak perlu menjalankan npm run build: android : release

Menggunakan versi asli react 55.4 di sini adalah inti proyek sampel saya untuk build.gradle package.json dengan perbaikan.

https://gist.github.com/Abhishekgarg727/daf031fb9f94fdfd985e84db57dedbe1

Saya masih melihat ini, menggunakan macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. Mungkin aku bukan satu-satunya? Atau mungkin seseorang di sini dapat mengonfirmasi bahwa ini berfungsi jadi saya akan menggali lebih banyak dan memperbaikinya sendiri secara nyata.

Saat ini saya sedang mengerjakannya dengan paket "patch-package" yang dikombinasikan dengan patch terlampir berdasarkan komentar di atas dari @mkchx (dengan akhiran .txt ditambahkan sehingga github akan menerima lampiran) untuk secara otomatis perbaiki pada 'npm install' setelah menambahkan postinstall: patch-package ke skrip package.json saya.

Mungkin ini berguna untuk seseorang ...
react-native + 0.57.8.patch.txt

Hapus file yang mungkin Anda miliki di:

android / app / src / main / res / drawable-mdpi /
android / app / src / main / res / drawable-xhdpi /
android / app / src / main / res / drawable-xxhdpi /
Jalankan Build lagi, Ini memperbaiki masalah saya.

Saya masih melihat ini di RN0.58.x dan berlanjut di RN0.59.x - apakah kita melakukan sesuatu yang salah di sini atau apakah ini benar-benar bug?

Saya terus berhasil dengan solusi dari @mkchx yang dikodekan dalam bentuk tambalan di direktori tambalan untuk digunakan dengan modul paket tambalan dan tambalan ini (diperbarui untuk RN0.59.1)

react-native + 0.59.1.patch.txt

Jika Anda memiliki sumber daya tambahan yang ditambahkan di folder khusus, Anda mungkin ingin mencoba sesuatu seperti ini:

doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/release/${resSuffix}");
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/${resSuffix}");
            ant.move(file: originalDir, tofile: destDir);
        }
    }
    moveFunc.curry("drawable-ldpi").call()
    moveFunc.curry("drawable-mdpi").call()
    moveFunc.curry("drawable-hdpi").call()
    moveFunc.curry("drawable-xhdpi").call()
    moveFunc.curry("drawable-xxhdpi").call()
    moveFunc.curry("drawable-xxxhdpi").call()
    moveFunc.curry("raw").call()
}

Tetapi jika Anda memiliki dependensi yang mengemas aset mereka sendiri, itu tidak berfungsi, masih mendapatkan kesalahan ini (diedit untuk kejelasan):

Execution failed for task ':app:mergeReleaseResources'.

> [drawable-xxxhdpi-v4/node_modules_reactnavigationstack_dist_views_assets_backicon] 
/[...]/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigationstack_dist_views_assets_backicon.png

[drawable-xxxhdpi-v4/node_modules_reactnavigationstack_dist_views_assets_backicon] 
/[...]/android/app/build/generated/res/react/release/drawable-xxxhdpi/node_modules_reactnavigationstack_dist_views_assets_backicon.png: 

Error: Duplicate resources

Apakah ini dinilai secara aktif, atau haruskah kita melanjutkan dengan tambalan kita sendiri?

@dragosroua Saya melihat tanda hubung yang hilang di kari xxxhdpi Anda. Kebetulan jalan terdepan yang sama dengan masalah bagi Anda?

Anda mengalahkan saya dengan 2 menit, saya akan mengedit bagian itu. Ya, semua paket sekarang baik-baik saja, tetapi bit dengan jalur "mentah" untuk sumber daya khusus mungkin berguna untuk seseorang.

@dragosroua senang Anda mengkompilasi sekarang - Saya ingat betapa frustrasinya yang satu ini bagi saya, dan saya masih kagum itu tidak diperbaiki di master meskipun saya juga belum mengusulkan PR jadi saya kira saya mendapatkan apa yang saya masukkan. ..

Saya masih melihat ini, menggunakan macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. Mungkin aku bukan satu-satunya? Atau mungkin seseorang di sini dapat mengonfirmasi bahwa ini berfungsi jadi saya akan menggali lebih banyak dan memperbaikinya sendiri secara nyata.

Saat ini saya sedang mengerjakannya dengan paket "patch-package" yang dikombinasikan dengan patch terlampir berdasarkan komentar di atas dari @mkchx (dengan akhiran .txt ditambahkan sehingga github akan menerima lampiran) untuk secara otomatis perbaiki pada 'npm install' setelah menambahkan postinstall: patch-package ke skrip package.json saya.

Mungkin ini berguna untuk seseorang ...
react-native + 0.57.8.patch.txt

Tolong jelaskan mengapa untuk react-native 0.57.5 saya tidak berfungsi?
Saya membuat file pacth. Ditambahkan ke package.json. Jalankan npm install dan hasilnya

        def currentBundleTask = tasks.create(
            name: "bundle${targetName}JsAndAssets",
            type: Exec) {
            group = "react"
            description = "bundle JS and assets for ${targetName}."

            // Create dirs if they are not there (e.g. the "clean" task just ran)
            doFirst {
                jsBundleDir.deleteDir()
                jsBundleDir.mkdirs()
                resourcesDir.deleteDir()
                resourcesDir.mkdirs()
            }

            // Set up inputs and outputs so gradle can cache the result
            inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
            outputs.dir jsBundleDir
            outputs.dir resourcesDir

tanpa perubahan yang diperlukan.

@zakabluk Anda perlu memposting output dari instalasi npm Anda, tetapi sebagai tebakan itu karena paket patch-package sangat berhati-hati dengan nomor versi. Anda mencoba 57,5, tetapi tambalannya bertentangan dengan 57,8?

Saya biasanya membuat skrip python untuk menambal node_modules.
Tambahkan ini sebagai postinstall.py dan tambahkan ke skrip pasca-pemasangan Anda atau jalankan dengan ./postinstall.py

#!/usr/bin/env python3

import os
import textwrap

def file_dir():
  return os.path.dirname(os.path.realpath(__file__))

def read_file(filename):
    '''
    Reads the specified file.

    :param filename: The file to read
    :return: The content of the specified file
    '''
    if os.path.exists(filename):
        with open(filename, "r") as file:
            return file.read()
    else:
        raise IOError("file {} not found.".format(filename))

def write_file(filename, text):
    '''
    Writes the specified text to the specified file.

    :param filename: The file to write to
    :param text: The text to write
    '''
    with open(filename, "w") as file:
        file.write(text)

def fix_android_assets():
  print("Fixing android error with duplicate assets: https://github.com/facebook/react-native/issues/22234")

  gradle_file_path = "{}/node_modules/react-native/react.gradle".format(file_dir())

  code_snippet = textwrap.indent("""\
            // Added by post_install
            // Fix for: https://github.com/facebook/react-native/issues/22234
            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
                        ant.move(file: originalDir, tofile: destDir);
                    }
                }
                moveFunc.curry("ldpi").call()
                moveFunc.curry("mdpi").call()
                moveFunc.curry("hdpi").call()
                moveFunc.curry("xhdpi").call()
                moveFunc.curry("xxhdpi").call()
                moveFunc.curry("xxxhdpi").call()
            }
  """, "")

  text = read_file(gradle_file_path)

  start = text.find("doFirst", 0)
  end = text.find("}", start)
  end = text.find("\n", end) + 1

  text = text[:end] + code_snippet + text[end:]

  write_file(gradle_file_path, text)

def main():
    fix_android_assets()

if __name__ == "__main__":
    main()

Di sini Anda dapat menambahkan skrip Anda sendiri jika diperlukan

Sepertinya implementasi ulang dari apa yang Anda dapatkan dengan npm install patch-package tetapi jika python adalah milik Anda dan Anda ingin mempertahankan lebih banyak kode sendiri, itu tampaknya layak. Saya masih menggunakan patch-package untuk apa nilainya, dengan 0.59.3 seperti itu
react-native + 0.59.3.patch.txt

@hramos - # 19239 serupa (menurut saya) dan ini sudah berlangsung lama tetapi tampaknya ada perbaikan. Apakah ini hanya memerlukan PR untuk perbaikan akhir atau saya kehilangan alasan mengapa tambalan yang digunakan di sini tidak dapat digunakan? (Saya mungkin). Jika kita hanya membutuhkan PR, saya bisa mengirimkannya ...

Sepertinya implementasi ulang dari apa yang Anda dapatkan dengan npm install patch-package tetapi jika python adalah milik Anda dan Anda ingin mempertahankan lebih banyak kode sendiri, itu tampaknya layak. Saya masih menggunakan patch-package untuk apa nilainya, dengan 0.59.3 seperti itu
react-native + 0.59.3.patch.txt

@hramos - # 19239 serupa (menurut saya) dan ini sudah berlangsung lama tetapi tampaknya ada perbaikan. Apakah ini hanya memerlukan PR untuk perbaikan akhir atau saya kehilangan alasan mengapa tambalan yang digunakan di sini tidak dapat digunakan? (Saya mungkin). Jika kita hanya membutuhkan PR, saya bisa mengirimkannya ...

Bagaimana cara menggunakan jalur ini, terima kasih

@ZhanRu - https://github.com/ds300/patch-package#set -up - Anda hanya ingin meletakkan patch itu (dengan ekstensi .patch) ke dalam direktori 'patches' dalam proyek Anda setelah menginstal dan menyiapkan patch- paket

@ZhanRu - https://github.com/ds300/patch-package#set -up - Anda hanya ingin meletakkan patch itu (dengan ekstensi .patch) ke dalam direktori 'patches' dalam proyek Anda setelah menginstal dan menyiapkan patch- paket

Terima kasih banyak

Bagi siapa pun yang masih mengikuti, saya baru-baru ini mengintegrasikan sistem eksternal dan perlu memisahkan pengujian saya dari data eksternal produksi, yang mengarah pada penggunaan "rasa" dalam gradle sehingga Anda dapat memiliki qaDebug, stagingRelease, dll. Yang menunjuk ke sistem eksternal yang berbeda. Tambalan di sini tidak mendukung itu, jadi saya menambahkan dukungan rasa, dan tambalan saya terlihat seperti ini sekarang. Itu hidup di patches/react-native+0.59.5.patch mana itu diterapkan selama npm i berjalan setelah npm install patch-package

diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 4ead2b6..e0f92b7 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -48,6 +48,33 @@ afterEvaluate {
                 resourcesDir.mkdirs()
             }

+            // From https://stackoverflow.com/questions/53239705/react-native-error-duplicate-resources-android
+            // Currently has no solution?
+
+            // IF you are using flavors, add flavor name to the path you move from
+            def flavorPathSegment = ""
+            android.productFlavors.all { flavor ->
+                if (targetName.toLowerCase().contains(flavor.name)) {
+                    flavorPathSegment = flavor.name + "/"
+                }
+            }
+
+            doLast {
+                def moveFunc = { resSuffix ->
+                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
+                    if (originalDir.exists()) {
+                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
+                        ant.move(file: originalDir, tofile: destDir);
+                    }
+                }
+                moveFunc.curry("ldpi").call()
+                moveFunc.curry("mdpi").call()
+                moveFunc.curry("hdpi").call()
+                moveFunc.curry("xhdpi").call()
+                moveFunc.curry("xxhdpi").call()
+                moveFunc.curry("xxxhdpi").call()
+            }
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)

Dalam kasus saya, masalah tetap ada dengan direktori raw .

Versi: react-native 0.59.5

Solusi saya:

doLast {                                                                                            
  def moveFunc = { resSuffix ->                                                                   
    File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");     
    if (originalDir.exists()) {                                                                 
      File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");                 
      ant.move(file: originalDir, tofile: destDir);                                           
    }
  } 
  def moveRawFunc = { dir ->                                                                   
    File originalDir = file("$buildDir/generated/res/react/release/${dir}");     
    if (originalDir.exists()) {                                                                 
      File destDir = file("$buildDir/../src/main/res/${dir}");                 
      ant.move(file: originalDir, tofile: destDir);                                           
    }
  }  
  moveFunc.curry("ldpi").call()
  moveFunc.curry("mdpi").call()
  moveFunc.curry("hdpi").call()
  moveFunc.curry("xhdpi").call()
  moveFunc.curry("xxhdpi").call()
  moveFunc.curry("xxxhdpi").call()
  moveRawFunc.curry("raw").call()
}

Salam

@Dbroqua solusi Anda berhasil untuk saya (versi react-native 0.59.5 ). Terima kasih.

Sangat menarik - saya tidak punya masalah dengan raw - ketahuilah bahwa versi patch terbaru saya menambahkan dukungan untuk rasa. Jika Anda mulai melakukan ragam, Anda akan menginginkan dukungan ragam itu sekarang dalam kedua fungsi tersebut. Mungkin itu bisa menjadi parameter entah bagaimana sehingga 2 fungsi tidak berulang tetapi saya tidak cukup baik di groovy untuk merenungkannya.

Saya hanya bisa membayangkan ini bukan masalah di facebook dan di CI react-native karena mereka menggunakan BUCK dan CI mereka membangun bersih setiap saat. Adakah yang punya reproduksi bersih dari ini sehingga kita bisa memperbaikinya di hulu?

Dalam kasus saya, direktori mentah berisi beberapa mp3 yang digunakan dalam aplikasi saya.

Itu mungkin menjadi dasar dari repro cepat + mudah. Saya tidak memiliki aset seperti itu (belum) tetapi cukup mudah untuk bereaksi-asli init untuk repo, memasukkan beberapa aset kemudian saya pikir pada rilis rilis kedua (mungkin bahkan yang pertama?) Anda disemprot ...

@Dbroqua hanya sebuah

Baik,

Saya akan melakukan ASAP yang diperlukan.

Salam,
Damien

Tetap!

Dalam kasus saya, ada file di direktori res/drawable-* yang tersisa dari beberapa pengembang lain di tim saya komit - Saya mendapatkan "Kesalahan: Sumber daya duplikat" menunjuk ke nama file tersebut - Saya menghapus file dari drawable dan semuanya bekerja dengan baik 👍

Jawaban Mapsy akan membantu https://stackoverflow.com/a/52750886
Jadi pada dasarnya Anda mengedit file /node_modules/react-native/react.gradle
dan tambahkan doLast tepat setelah blok doFirst , secara manual.

doFirst { ... }
doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
            ant.move(file: originalDir, tofile: destDir);
        }
    }
    moveFunc.curry("ldpi").call()
    moveFunc.curry("mdpi").call()
    moveFunc.curry("hdpi").call()
    moveFunc.curry("xhdpi").call()
    moveFunc.curry("xxhdpi").call()
    moveFunc.curry("xxxhdpi").call()
}

tidak bekerja untuk saya.

@ Nextt1 Anda harus membuka terbitan baru - dengan test case yang dapat direproduksi dalam repo publik jika memungkinkan - dan mungkin mengusulkan PR baru. Masalah ini ditutup oleh PR saya dan kemudian masalah tambahan (menangani kasus yang tidak ditangani dengan baik oleh PR pertama saya) juga digabungkan, jadi kita semua telah pindah dan saya pikir ini berfungsi paling banyak sehingga masalah ini tidak mungkin terjadi. perhatian.

Halo semuanya - PR yang saya usulkan untuk memperbaikinya telah digabungkan tetapi tampaknya menyebabkan regresi - https://github.com/facebook/react-native/issues/25325 - Saya sedang menyelidiki tetapi jika ada guru gradle di sini, sekarang cara memperbaiki masalah ini tanpa menyebabkan kemunduran itu, bantuan akan sangat kami hargai - terima kasih!

Oke, PR terkait di sini akan memiliki "PR kembali" - ini menyebabkan regresi, dan masalah mendasar yang menyebabkan masalah ini sebenarnya adalah dokumentasi yang buruk.

Begini masalahnya: Anda tidak boleh menyalin sesuatu ke direktori src selama pembuatan benar-benar. Anda perlu menyalin hal-hal ke perantara dan menghasilkan dll. Jika Anda telah menyalin sesuatu ke src (dari build sebelumnya menggunakan patch ini, atau dari perintah bundel react-native): Anda perlu menghapusnya sehingga src / main / res Anda direktori bersih - hanya aset nyata dari proyek Anda

Sekarang, untuk membangun APK dengan bundel offline - bahkan dalam dev sehingga Anda dapat menjalankannya di API <17, Anda harus melakukan hal-hal yang berbeda dari yang direkomendasikan semua orang di web (atau Anda akan mengalami masalah ini).

Yang Anda inginkan adalah ini di android/app/build.gradle :

project.ext.react = [

        // This is what most people will need
        bundleInDebug: project.hasProperty("bundleInDebug") ? project.getProperty("bundleInDebug") : false,

        // If you use build variants it has to be like this - put your own names in there
        bundleInDevDebug: project.hasProperty("bundleInDevDebug") ? project.getProperty("bundleInDevDebug") : false,
        bundleInQaDebug: project.hasProperty("bundleInQaDebug") ? project.getProperty("bundleInQaDebug") : false,
        bundleInStagingDebug: project.hasProperty("bundleInStagingDebug") ? project.getProperty("bundleInStagingDebug") : false,
        bundleInProdDebug: project.hasProperty("bundleInProdDebug") ? project.getProperty("bundleInProdDebug") : false
]

Kemudian Anda memanggil react-native sesuatu seperti ini - mengirim properti proyek gradle melalui variabel lingkungan:
ORG_GRADLE_PROJECT_bundleInDebug=true npx react-native run-android

(atau untuk varian seperti ini ORG_GRADLE_PROJECT_bundleInDevDebug=true npx react-native run-android --variant devDebug )

Saya masih melihat ini, menggunakan macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. Mungkin aku bukan satu-satunya? Atau mungkin seseorang di sini dapat mengonfirmasi bahwa ini berfungsi jadi saya akan menggali lebih banyak dan memperbaikinya sendiri secara nyata.

Saat ini saya sedang mengerjakannya dengan paket "patch-package" yang dikombinasikan dengan patch terlampir berdasarkan komentar di atas dari @mkchx (dengan akhiran .txt ditambahkan sehingga github akan menerima lampiran) untuk secara otomatis perbaiki pada 'npm install' setelah menambahkan postinstall: patch-package ke skrip package.json saya.

Mungkin ini berguna untuk seseorang ...
react-native + 0.57.8.patch.txt

Hebat! Untuk saat ini, itu jawaban terbaik!

Saya masih melihat ini di 0,59,9. Jawaban @mkchx menyelesaikan masalah bagi saya

@juliancorrea @scgough berhati-hatilah dengan itu, saya mengikuti gaya solusi itu sepenuhnya dengan PR yang diterima bahkan, tetapi setelah masalah lanjutan kami perlu mengembalikannya. Ini solusi buntu. Saya memposting detail lengkap dari solusi yang saat ini direkomendasikan beberapa komentar di atas dan hanya dapat merekomendasikan gaya baru. Jika Anda menggunakan tambalan terlampir lama saya berdasarkan jawaban @mkchx, itu akan bekerja untuk Anda, untuk saat ini, tetapi hanya dalam kondisi tertentu - itu gagal dalam skenario umum lainnya yang mungkin diperlukan proyek Anda di masa depan

@mikehardy OK - Saya akan melihat solusi Anda sekarang.
Saya _memikirkan_ yang sebenarnya saya inginkan adalah agar APK yang ditandatangani Android Studio melewati bundel (karena saya melakukan ini secara manual melalui terminal).
Saya akan melihat pengaturan yang Anda berikan dan melihat apakah itu membantu.

Saya masih mengalami masalah dengan ini ...
Sepertinya saya tidak dapat membuat file APK rilis saya. Saya mendapatkan kesalahan berikut untuk setiap file aset:

[drawable-mdpi-v4/filename] /Users/me/React/myapp/android/app/src/main/res/drawable-mdpi/filename.png
[drawable-mdpi-v4/filename] /Users/me/React/myapp/android/app/build/generated/res/react/release/drawable-mdpi/filename.png : Kesalahan: Sumber daya duplikat

Saya telah menghapus kedua contoh folder drawable-mdpi tetapi pembuatan APK menempatkannya kembali dan kesalahan.
Saya menjalankan yang berikut ini secara manual untuk membuat bundel saya:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

Di app gradle saya, saya memiliki:

project.ext.react = [
    entryFile: "index.android.js",
    bundleInRelease: true    //I've tried true and false here
]

apply from: "../../node_modules/react-native/react.gradle"

Sama seperti info tambahan - aplikasi saya dibuat dengan baik di debug (melalui react-native run-android )
Saat ini satu-satunya cara saya bisa mendapatkan APK rilis untuk membangun adalah melalui perbaikan PR doLast dikembalikan di atas.

Saya pikir saya mungkin memiliki alasan / solusi untuk masalah saya setidaknya.

Perintah bundel lama saya (saya telah menggunakan sejak RN 0.2.x ?!) mendorong aset ke folder tujuan android/app/src/main/res/

Saya mencatat posting di tautan di bawah ini yang menyatakan bahwa> RN 57 sebenarnya membutuhkan aset yang didorong ke folder berikut:
android/app/build/intermediates/res/merged/release/

Sumber: https://github.com/facebook/react-native/issues/19211#issuecomment -448301870

Saya melakukan hal berikut:

  • menghapus aset drawable-mdpi yang telah disalin ke android/app/src/main/res/
  • memperbarui perintah bundel saya untuk menggunakan lokasi folder baru
  • APK saya sekarang dibuat ... (_ Saya akan mengujinya_)

memperbarui
APK terinstal tetapi aplikasi sekarang mogok dengan pengecualian:
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'defaultSrc' of a view managed by: RCTImageView

... jadi sepertinya tidak dapat menemukan gambar 😞

perbarui 2
Satu-satunya cara saya dapat membuat APK berfungsi (sejauh ini) adalah dengan melakukan hal berikut:

  • kembalikan panggilan bundel saya untuk menggunakan aset berikut ini: android/app/src/main/res/
  • jalankan perintah bundel
  • ganti nama android/app/src/main/res/drawable-mdpi menjadi android/app/src/main/res/drawable-hdpi
  • buat APK yang ditandatangani

gradle build saya adalah:

project.ext.react = [
    entryFile: "index.android.js"
]

APK kemudian membangun dan menjalankan ...

Catatan Samping:
Saya mendapatkan bug yang tidak terduga muncul sehingga menghasilkan pengecualian createBitmap OutOfMemory pada komponen slider gambar.
Saya telah menambahkan yang berikut ini ke manifes saya dan aplikasi berjalan lagi: android:largeHeap="true"
Saya sadar bahwa penambahan melewati apa yang bisa menjadi masalah kebocoran / komponen tetapi sejauh ini aplikasi berjalan tanpa masalah lagi.

Di React Native 0.60.0 saya memperhatikan bahwa native base juga membuat sumber duplikat tetapi solusi di atas tidak akan berfungsi karena menargetkan folder mentah.

[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] C: \ Projects \ some-app \ CLIENT \ android \ app \ src \ main \ resrawnode_modules_nativebase_dist_src_basic_icon_nbicons.json
[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] C: \ Projects \ some-app \ CLIENT \ android \ app \ build \ generated \ res \ reactreleaserawnode_modules_nativebase_dist_src_basic_icon_nbicons.json: Kesalahan: Sumber daya duplikat

Untuk pengguna lain yang mengalami masalah ini:

        doLast {
            def moveFunc = { resSuffix ->
                File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
                    ant.move(file: originalDir, tofile: destDir);
                }
            }

            moveFunc.curry("ldpi").call()
            moveFunc.curry("mdpi").call()
            moveFunc.curry("hdpi").call()
            moveFunc.curry("xhdpi").call()
            moveFunc.curry("xxhdpi").call()
            moveFunc.curry("xxxhdpi").call()

            File originalDir = file("$buildDir/generated/res/react/release/raw");
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/raw");
                    ant.move(file: originalDir, tofile: destDir);
            }
        }

bagaimana kita bisa mengatasi ini jika kita menggunakan CI?

Dalam kasus saya, masalah tetap ada dengan direktori raw .

Versi: react-native 0.59.5

Solusi saya:

doLast {                                                                                            
  def moveFunc = { resSuffix ->                                                                   
    File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");     
    if (originalDir.exists()) {                                                                 
      File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");                 
      ant.move(file: originalDir, tofile: destDir);                                           
    }
  } 
  def moveRawFunc = { dir ->                                                                   
    File originalDir = file("$buildDir/generated/res/react/release/${dir}");     
    if (originalDir.exists()) {                                                                 
      File destDir = file("$buildDir/../src/main/res/${dir}");                 
      ant.move(file: originalDir, tofile: destDir);                                           
    }
  }  
  moveFunc.curry("ldpi").call()
  moveFunc.curry("mdpi").call()
  moveFunc.curry("hdpi").call()
  moveFunc.curry("xhdpi").call()
  moveFunc.curry("xxhdpi").call()
  moveFunc.curry("xxxhdpi").call()
  moveRawFunc.curry("raw").call()
}

Salam

Ini bekerja!

[drawable-mdpi-v4/node_modules_reactnativemaplink_src_images_uber] /Users/umair/my-app/android/app/src/main/res/drawable-mdpi/node_modules_reactnativemaplink_src_images_uber.png   [drawable-mdpi-v4/node_modules_reactnativemaplink_src_images_uber] /Users/umair/my-app/android/app/build/generated/res/react/debug/drawable-mdpi/node_modules_reactnativemaplink_src_images_uber.png: Error: Duplicate resources

Saya mendapatkan kesalahan ini saat menjalankan react-native run-android tetapi tidak saat saya membangun dan menjalankan rilis build. Tidak ada solusi di atas yang berhasil untuk saya.

RN 0.60.5

UPDATE: Saya menyadari bahwa saya harus memodifikasi metode "patch" di atas untuk mengutip debug daripada release direktori dan itu memperbaikinya. Saya juga harus memperbaiki direktori raw

Saya juga mengalami masalah yang sama dan patch react.gradle tidak akan memperbaikinya. Dalam kasus saya, sumber daya duplikat saya adalah file .OBJ dan .MTL, tidak memiliki masalah dengan sumber gambar.

[raw / assets_res_salad_salad] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_salad_salad.mtl [raw / assets_res_salad_salad] / Users / sercanov / Projects / ARt / diner / DinerApp /android/app/src/main/res/raw/assets_res_salad_salad.obj: Kesalahan: Sumber daya duplikat
[raw / assets_res_steak_steak] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_steak_steak.mtl [raw / assets_res_steak_steak] / Users / sercanov / Projects / ARt / diner / DinerApp /android/app/src/main/res/raw/assets_res_steak_steak.obj: Kesalahan: Sumber daya duplikat
[raw / assets_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_salmon_salmon.mtl [raw / assets_res_salmon_salmon] / Users / sercanov / Projects / ARt / diner / DinerApp /android/app/src/main/res/raw/assets_res_salmon_salmon.obj: Kesalahan: Sumber daya duplikat

@sercanov apakah Anda masih mencoba menggunakan salinan ke src? Gaya itu telah diselidiki dan gagal karena alasan yang diketahui, ada cara yang didukung untuk membangun yang tidak menempatkan sesuatu di src - atau apakah Anda mencoba cara bukan-copy-to-src dan masih gagal? https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

hey @mikehardy sebenarnya mencoba kedua pendekatan tersebut, tidak satu pun dari pendekatan tersebut yang berhasil dalam build rilis. Ia bekerja dengan baik dalam mode debug btw.

Saat menggunakan cara bukan-copy-to-src ORG_GRADLE_PROJECT_bundleInArRelease=true npx react-native run-android --variant arRelease Saya mendapatkan yang ini;

Eksekusi gagal untuk tugas ': app: mergeArReleaseResources '.
[raw / assets_res_salad_salad] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.mtl [raw / assets_res_salad_salad] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.obj: Kesalahan: Sumber daya duplikat
[raw / assets_res_steak_steak] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_steak_steak.mtl [raw / assets_res_steak_steak] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_steak_steak.obj: Kesalahan: Sumber daya duplikat
[raw / assets_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.mtl [raw / assets_res_salmon_salmon] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.obj: Kesalahan: Sumber daya duplikat

Saat digunakan cara copy-to-src doLast; Saya harus menghapus folder android / build setiap kali saya membangun agar berhasil tetapi entah bagaimana aset tidak tersedia di aplikasi. Ini mungkin terkait dengan kode saya, yang saat ini sedang menyelidikinya.

Saat beralih ke cara non-copy-to-src Anda harus membersihkan semuanya terlebih dahulu, untuk beralih. Proyek saya memiliki banyak "sampah" dari perspektif bundling dari gaya copy-to-src sebelumnya yang harus saya bersihkan sebelum berhasil, lalu berhasil setiap saat.

@ rahulkumar1409 ini membantu saya dalam kesalahan ini, tetapi itu membuat kesalahan lain

Tugas: react-native-simple-download- manager: verifikasiReleaseResources GAGAL

Apakah Anda tahu mengapa ini terjadi ??

Solusi ini berhasil untuk saya.
Jadi pada dasarnya Anda mengedit file /node_modules/react-native/react.gradle
dan tambahkan doLast tepat setelah blok doFirst, secara manual.

doFirst {...}
doLast {
def moveFunc = {resSuffix ->
File originalDir = file ("$ buildDir / generated / res / react / release / drawable - $ {resSuffix}");
if (originalDir.exists ()) {
File destDir = file ("$ buildDir /../ src / main / res / drawable - $ {resSuffix}");
ant.move (file: originalDir, tofile: destDir);
}
}
moveFunc.curry ("ldpi"). call ()
moveFunc.curry ("mdpi"). call ()
moveFunc.curry ("hdpi"). call ()
moveFunc.curry ("xhdpi"). call ()
moveFunc.curry ("xxhdpi"). call ()
moveFunc.curry ("xxxhdpi"). call ()
}

Kami berada di react-native 0.60.5.

Kami menggunakan rasa produk seperti yang @mikehardy sebutkan dan kami memiliki masalah dengan folder 'mentah' seperti yang dialami @Dbroqua .

Saya akhirnya mencampur kedua solusi dan kami menggunakan kode ini:

doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
            ant.move(file: originalDir, tofile: destDir)
        }
    }
    def moveRawFunc = { dir ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/${dir}")
            ant.move(file: originalDir, tofile: destDir)
        }
    }

    moveFunc.curry("ldpi").call()
    moveFunc.curry("mdpi").call()
    moveFunc.curry("hdpi").call()
    moveFunc.curry("xhdpi").call()
    moveFunc.curry("xxhdpi").call()
    moveFunc.curry("xxxhdpi").call()
    moveRawFunc.curry("raw").call()
}

Utas ini sangat membantu, terima kasih kepada semua orang atas kontribusinya. 😄

Saya mendapatkan kesalahan duplikat hanya pada versi rilis. Saya menggunakan react-native 60.5

/release/drawable-xhdpi/node_modules_reactnavigationstack_lib_module_views_assets_backicon.png: Kesalahan: Sumber daya duplikat

Saya sudah mencoba mengatur bundleInDebug menjadi true dan false tetapi tidak berpengaruh.

Saya sedang membangun menggunakan app center, ini membutuhkan file src / main / assets / appcenter-config.json. Saya juga memiliki direktori src / main / assets / font karena saya menggunakan font khusus. Apakah ini mungkin yang menyebabkan masalah?

@ ARichIVC Saya menduga masalahnya adalah file yang direferensikan dalam pesan kesalahan Anda.

Sepertinya standar "direktori src / saya tercemar dari percobaan gaya-salinan sebelumnya untuk menangani masalah pengemasan bundel" dari solusi asli ini sebelum kita semua menyadari bahwa ini adalah solusi buntu dan Anda perlu menghapus src / dari yang disalin hal-hal sebelum mencoba solusi tindak lanjut untuk melakukan hal bundleInDebug. Semuanya ada di utas ini yang sayangnya berat dan panjang, tetapi infonya ada di sana

Terima kasih @mikehardy atas bantuan Anda. Saya merasa tidak apa-apa untuk meninggalkan font dll di direktori aset tetapi perlu menghapus potongan-potongan lain yang berkeliaran. Yakni semua yang ada di \ android \ app \ src \ main \ res \ drawable-hdpi \

Perhatikan bahwa bahkan untuk font, mereka harus berada di direktori yang benar - contoh: https://github.com/oblador/react-native-vector-icons#android yang mengarahkan Anda untuk memanggil file ini yang dengan hati-hati menyalin ke non-src direktori https://github.com/oblador/react-native-vector-icons/blob/master/fonts.gradle#L16 - proyek setiap orang tentu saja berbeda, tetapi saya pikir itu layak untuk disebutkan

Kami berada di react-native 0.60.5.

Kami menggunakan rasa produk seperti yang @mikehardy sebutkan dan kami memiliki masalah dengan folder 'mentah' seperti yang dialami @Dbroqua .

Saya akhirnya mencampur kedua solusi dan kami menggunakan kode ini:

doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
            ant.move(file: originalDir, tofile: destDir)
        }
    }
    def moveRawFunc = { dir ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/${dir}")
            ant.move(file: originalDir, tofile: destDir)
        }
    }

    moveFunc.curry("ldpi").call()
    moveFunc.curry("mdpi").call()
    moveFunc.curry("hdpi").call()
    moveFunc.curry("xhdpi").call()
    moveFunc.curry("xxhdpi").call()
    moveFunc.curry("xxxhdpi").call()
    moveRawFunc.curry("raw").call()
}

Utas ini sangat membantu, terima kasih kepada semua orang atas kontribusinya. 😄

berhasil! Terima kasih banyak! 👍

Untuk react native 0.59.1 atau lebih besar, Anda perlu menambahkan kode di bawah ini di react.gradle di node_modules / react-native.

untuk penggunaan rasa di bawah kode.

        def flavorPathSegment = ""
        android.productFlavors.all { flavor ->
            if (targetName.toLowerCase().contains(flavor.name)) {
                flavorPathSegment = flavor.name
           }
        }
        doLast {
            def moveFunc = { resSuffix ->
                File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}/release/drawable-${resSuffix}");
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
                    ant.move(file: originalDir, tofile: destDir);
                }
            }
            moveFunc.curry("ldpi").call()
            moveFunc.curry("mdpi").call()
            moveFunc.curry("hdpi").call()
            moveFunc.curry("xhdpi").call()
            moveFunc.curry("xxhdpi").call()
            moveFunc.curry("xxxhdpi").call()
        }

@ dayachand-systematix nasihat buruk ini. Solusi gaya itu dikejar ke titik di mana ia memiliki PR dan digabungkan. Kemudian ketahuan itu arah yang salah dan PR dikembalikan. Apakah Anda akan menyarankan orang-orang untuk menggunakan solusi yang sebenarnya menyebabkan penggabungan PR dikembalikan? Saya tidak akan. https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

@mikehardy Ya, saya tahu ini bukan solusi permanen tetapi berfungsi dengan baik. Dan juga saya tidak dapat menggunakan solusi Anda karena saya memiliki beberapa file lain seperti layar splash dan DB di direktori res .

Ya @ dayachand-systematix saya juga:

mike<strong i="6">@isabela</strong>:~/work/Kullki/ksocialscore/packages/public-app/android/app (lerna-import) % find . -type f |grep res
./src/main/res/drawable-xhdpi/minilogo_bw.png
./src/main/res/mipmap-xxhdpi/ic_launcher.png
./src/main/res/values-v21/styles.xml
./src/main/res/drawable-xxhdpi/minilogo_bw.png
./src/main/res/drawable-xxhdpi/kscore_splash.png
./src/main/res/drawable-hdpi/minilogo_bw.png
./src/main/res/mipmap-xxxhdpi/ic_launcher.png
./src/main/res/mipmap-hdpi/ic_launcher.png
./src/main/res/layout/launch_screen.xml
./src/main/res/drawable/background_launch.xml
./src/main/res/values/colors.xml
./src/main/res/values/styles.xml
./src/main/res/values/strings.xml
./src/main/res/mipmap-xhdpi/ic_launcher.png
./src/main/res/xml/filepaths.xml
./src/main/res/xml/react_native_config.xml
./src/main/res/drawable-mdpi/minilogo_bw.png
./src/main/res/drawable-xxxhdpi/minilogo_bw.png
./src/main/res/mipmap-mdpi/ic_launcher.png
./src/qa/res/mipmap-xxhdpi/ic_launcher.png
./src/qa/res/mipmap-xxxhdpi/ic_launcher.png
./src/qa/res/mipmap-hdpi/ic_launcher.png
./src/qa/res/values/strings.xml
./src/qa/res/mipmap-xhdpi/ic_launcher.png
./src/qa/res/mipmap-mdpi/ic_launcher.png
./src/debug/res/xml/react_native_config.xml
./src/staging/res/mipmap-xxhdpi/ic_launcher.png
./src/staging/res/mipmap-xxxhdpi/ic_launcher.png
./src/staging/res/mipmap-hdpi/ic_launcher.png
./src/staging/res/values/strings.xml
./src/staging/res/mipmap-xhdpi/ic_launcher.png
./src/staging/res/mipmap-mdpi/ic_launcher.png
./src/dev/res/mipmap-xxhdpi/ic_launcher.png
./src/dev/res/mipmap-xxxhdpi/ic_launcher.png
./src/dev/res/mipmap-hdpi/ic_launcher.png
./src/dev/res/values/strings.xml
./src/dev/res/mipmap-xhdpi/ic_launcher.png
./src/dev/res/mipmap-mdpi/ic_launcher.png

Dan tetap saja solusi yang disarankan / tidak-PR-dikembalikan berfungsi untuk saya: man_shrugging:

Heya, kami memperbaikinya dengan menghapus parameter --asset-dest :

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle

@ hery-finimize hi - tidak akan menghapus parameter --asset-dest mengakibatkan aset terbaru tidak dibundel ke tempat yang benar ... jadi ketika Anda membuat APK akan ada bahaya kehilangan / kehilangan tanggal file aset di aplikasi?

@ Scgough Saya pikir itu mungkin masalahnya. Jika demikian, kita dapat secara selektif menghapus semua aset duplikat kecuali aset lokal yang kita butuhkan sebelum membangun dengan Android Studio atau alur kerja produksi mana pun, misalnya

find android/app/src/main/res/drawable-* \( -name launch_screen.png -o -name ic_stat_onesignal_default.png -prune \) -o -type f -exec rm {} +

Tidak ideal tetapi harus berhasil sampai ini diselesaikan.

Masalah ini disebabkan ketika Anda memiliki file dengan nama yang sama dan ekstensi yang berbeda di folder aset seperti itu

back.png
back.jpg

karena di android keduanya memanggil seperti itu;

R.drawable.back
R.drawable.back

hapus atau ganti nama salah satu file.

Hai,
Saya telah mencoba untuk memodifikasi react.gradle: Build melangkah lebih jauh (app.aab adalah build tetapi saya tidak dapat membangun APK.

Saya sudah mencoba membangun APK dengan Android Studio dan tidak ada masalah (dengan patch to react.gradle).
Cukup aneh bagi saya karena proses pembuatan APK harus sama di kedua kasus. Apakah aku salah ?

Komentar ini berhasil untuk 0.59.10. Dicampur dengan inti ini .

Terima kasih banyak, @ dayachand-systematix!

Apa yang berhasil bagi saya adalah kombinasi dari dua komentar:

Saya menempelkan ini di sini untuk siapa saja yang mungkin membutuhkannya.

``
def flavorPathSegment = ""
android.productFlavours.all {flavor ->
if (targetName.toLowerCase (). contains (flavor.name)) {
flavorPathSegment = flavor.name
}
}

        doLast {
            def moveFunc = { resSuffix ->
                File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                    ant.move(file: originalDir, tofile: destDir)
                }
            }
            def moveRawFunc = { dir ->
                File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/${dir}")
                    ant.move(file: originalDir, tofile: destDir)
                }
            }

            moveFunc.curry("ldpi").call()
            moveFunc.curry("mdpi").call()
            moveFunc.curry("hdpi").call()
            moveFunc.curry("xhdpi").call()
            moveFunc.curry("xxhdpi").call()
            moveFunc.curry("xxxhdpi").call()
            moveRawFunc.curry("raw").call()
        }

@AbhishekNairOfficial di mana Anda meletakkan ini?

@AbhishekNairOfficial di mana Anda meletakkan ini?

node_modules / react-native / react.gradle.

Letakkan ini setelah blok doFirst ()

@AbhishekNairOfficial di mana Anda meletakkan ini?

node_modules / react-native / react.gradle.

Letakkan ini setelah blok doFirst ()

Saya kira ini bukan cara yang tepat untuk mengatasi masalah ini. Karena perubahan ini akan ditimpa pada npm install . Bahkan CI tidak akan berfungsi

Seseorang mencoba perintah di bawah ini?

cd android
./gradlew clean
cd ..

Itu berhasil untuk saya

Apa yang berhasil bagi saya adalah kombinasi dari dua komentar:

Saya menempelkan ini di sini untuk siapa saja yang mungkin membutuhkannya.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }

                moveFunc.curry("ldpi").call()
                moveFunc.curry("mdpi").call()
                moveFunc.curry("hdpi").call()
                moveFunc.curry("xhdpi").call()
                moveFunc.curry("xxhdpi").call()
                moveFunc.curry("xxxhdpi").call()
                moveRawFunc.curry("raw").call()
            }

oh man kamu menyelamatkan hariku <3

Apa yang berhasil bagi saya adalah kombinasi dari dua komentar:
Saya menempelkan ini di sini untuk siapa saja yang mungkin membutuhkannya.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }

                moveFunc.curry("ldpi").call()
                moveFunc.curry("mdpi").call()
                moveFunc.curry("hdpi").call()
                moveFunc.curry("xhdpi").call()
                moveFunc.curry("xxhdpi").call()
                moveFunc.curry("xxxhdpi").call()
                moveRawFunc.curry("raw").call()
            }

oh man kamu menyelamatkan hariku <3

Haha terima kasih. Saya terus membuka utas ini hampir setiap hari, jadi saya memutuskan untuk membuat hidup lebih mudah bagi orang lain juga.

Menghapus folder android/app/build dan membuat lagi berhasil untuk saya.

Solusi saya:
Hapus semua file di / your_project / android / app / src / main / raw / res .
Ini berhasil untuk saya!

Apa yang berhasil bagi saya adalah kombinasi dari dua komentar:

Saya menempelkan ini di sini untuk siapa saja yang mungkin membutuhkannya.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }

                moveFunc.curry("ldpi").call()
                moveFunc.curry("mdpi").call()
                moveFunc.curry("hdpi").call()
                moveFunc.curry("xhdpi").call()
                moveFunc.curry("xxhdpi").call()
                moveFunc.curry("xxxhdpi").call()
                moveRawFunc.curry("raw").call()
            }

terima kasih @AbhishekNairfficial. itu menghemat banyak waktu untuk saya.

rm -rf ./android/app/src/main/res/drawable-*
rm -rf ./android/app/src/main/res/raw

Jadi ini berhasil, tetapi kemudian gambar Anda hilang, jadi jika Anda membundel kembali aplikasi Anda kemudian mencoba membangun Anda mendapatkan kesalahan yang sama. Ada yang punya solusi resmi untuk ini?

Mendapatkan hal yang sama di v0.61.5 dan seperti yang dikatakan @ wincod75 , menghapus folder raw dan drawable sebenarnya bukan solusi karena semua gambar dihapus.

Saya mendapatkan mereka dibuat ulang untuk rilis build tetapi alangkah baiknya jika mereka juga bekerja saat menjalankan react-native run-android --variant = release, yang hanya berfungsi ketika mereka berada di src / main itu jahitan dan kemudian tidak dapat membangun .

Adakah yang bisa menyelesaikan di v0.61.5?

@ gudbrand3 Saya akhirnya menerapkan perbaikan yang disebutkan di atas ke file "node_modules / react-native / react.gradle," supaya saya bisa mendapatkan versi baru untuk appstore, tetapi ini tidak masuk akal untuk dilakukan, tidak yakin mengapa hasn ini belum diperbaiki ...

@ wincod75 dengar dengar! Saya berakhir dengan hal yang sama .. bla. Saya juga tidak mengerti mengapa itu tidak hanya disertakan dalam paket sampai pendekatan yang lebih baik ditemukan karena orang akhirnya melakukannya secara manual. Sekarang harus dilakukan ulang untuk setiap penghapusan node_modules dan instal ulang npm. #frustrating

Menghapus folder drawable tidak akan berhasil untuk saya karena saya memiliki sumber daya drawable yang perlu saya simpan. Masalah saya adalah dengan duplicate resources untuk semua yang ada di folder android/app/src/main/res/raw dan file yang dimulai dengan nodemodules... di folder android/app/src/main/res/drawable . Ini memecahkan masalah saya:

Menambahkan ke android/app/build.gradle :

...
project.ext.react = [
    ...
    bundleInRelease        : true,
    resourcesDirRelease   : "src/release/res",
    ...
]
...

Menghapus semua yang dimulai dengan node dari android/app/src/main/drawable* :

rm android/app/src/main/drawable*/node*
rm -rf android/app/src/main/raw

Bersihkan proyek, JANGAN JALANKAN PERINTAH REACT NATIVE BUNDLE , lalu bangun kembali.

Semoga ini bisa membantu seseorang!

Oh Boy. Mungkin perbaikan resmi sedang dalam proses?

Saya mengalami masalah yang sama di v.0.61.4

dalam hal ini
pertama: Saya menempatkan kode berikut di node_modules / react-native / react.gradle setelah 'doFirst'

doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
            ant.move(file: originalDir, tofile: destDir);
        }
    }
    moveFunc.curry("ldpi").call()
    moveFunc.curry("mdpi").call()
    moveFunc.curry("hdpi").call()
    moveFunc.curry("xhdpi").call()
    moveFunc.curry("xxhdpi").call()
    moveFunc.curry("xxxhdpi").call()
}

kedua: Saya menghapus semua konten folder android / app / src / main / res / raw
semoga bermanfaat bagi seseorang

Oh Boy. Mungkin perbaikan resmi sedang dalam proses?

Saya harap demikian, saya menggunakan RN 0.62.1 dan mengalami masalah ini juga.

Menambahkan kode doLast atau menghapus folder drawable memecahkan masalah ini.

Saya ingin tahu apa rekomendasi resminya?

Terima kasih

Menghapus folder drawable tidak akan berhasil untuk saya karena saya memiliki sumber daya drawable yang perlu saya simpan. Masalah saya adalah dengan duplicate resources untuk semua yang ada di folder android/app/src/main/res/raw dan file yang dimulai dengan nodemodules... di folder android/app/src/main/res/drawable . Ini memecahkan masalah saya:

Menambahkan ke android/app/build.gradle :

...
project.ext.react = [
    ...
    bundleInRelease        : true,
    resourcesDirRelease   : "src/release/res",
    ...
]
...

Menghapus semua yang dimulai dengan node dari android/app/src/main/drawable* :

rm android/app/src/main/drawable*/node*
rm -rf android/app/src/main/raw

Bersihkan proyek, JANGAN JALANKAN PERINTAH REACT NATIVE BUNDLE , lalu bangun kembali.

Semoga ini bisa membantu seseorang!

Solusi di atas membantu saya menemukan jawaban yang layak:

Langkah 1:

Menambahkan ke android/app/build.gradle :

... project.ext.react = [ ... bundleInRelease : true, resourcesDirRelease : "src/release/res", ... ] ...

Langkah 2:

Jalankan perintah berikut untuk menghapus semua file node_module.

rm -rf drawable*/node*

Langkah 3:

Jalankan perintah ini untuk membangun dan APK.

./gradlew assembleRelease

Langkah 4:

Saya membuat skrip berikut untuk digunakan di package.json saya

"release-apk": "cd android && yarn remove-duplicate-files  && ./gradlew assembleRelease"

Semoga ini membantu!
Dan terima kasih semua orang yang mendukung solusi mereka

Untuk siapa saja yang memiliki masalah pada sumber daya non-gambar; Saya menyelesaikannya dengan mengganti nama file dengan nama yang sama tetapi ekstensi berbeda.

Kasus saya

Saya memiliki file object.obj dan object.mtl . Bahkan jika ekstensi berbeda, itu menimbulkan kesalahan sumber daya duplikat. Karena android mengambilnya dengan nama file. Jadi, mengganti nama object.mtl menjadi object_material.mtl akhirnya menyelesaikannya untuk saya.

Ini mungkin kasus yang sama untuk sumber gambar juga, coba ganti namanya jika Anda memiliki gambar dengan nama yang identik.

Apa yang berhasil bagi saya adalah kombinasi dari dua komentar:

Saya menempelkan ini di sini untuk siapa saja yang mungkin membutuhkannya.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }

                moveFunc.curry("ldpi").call()
                moveFunc.curry("mdpi").call()
                moveFunc.curry("hdpi").call()
                moveFunc.curry("xhdpi").call()
                moveFunc.curry("xxhdpi").call()
                moveFunc.curry("xxxhdpi").call()
                moveRawFunc.curry("raw").call()
            }

targetName.toLowerCase().contains(flavor.name.toLowerCase()) bekerja untuk saya.
flavor.name terlihat seperti xxXX.

Semua barang tolol itu ditambahkan di PR # 24518 dan # 24778, lalu dihapus lagi di # 25363. Adakah yang tahu mengapa itu dihapus? Ini telah menjadi masalah lama, dan saya pikir mereka telah memperbaikinya.

Sudahlah, jawabannya di sini:
https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
dan di sini: https://github.com/facebook/react-native/issues/25325

Jika itu membantu, berikut adalah beberapa baris satu dari skrip saya (untuk masalah Android X juga):

echo "Fixing java error: package android.support.v4.widget does not exist issue with Android X"

npm install jetifier
npx jetify

echo "Fixing duplicate resources issue"
rm -rf .../android/app/src/main/res/raw

cd .../node_modules/react-native

cat <<EOT >> react_gradle.patch
121a122,137
>             doLast {
>                 def moveFunc = { resSuffix ->
>                     File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
>                     if (originalDir.exists()) {
>                         File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
>                         ant.move(file: originalDir, tofile: destDir);
>                     }
>                 }
>                 moveFunc.curry("ldpi").call()
>                 moveFunc.curry("mdpi").call()
>                 moveFunc.curry("hdpi").call()
>                 moveFunc.curry("xhdpi").call()
>                 moveFunc.curry("xxhdpi").call()
>                 moveFunc.curry("xxxhdpi").call()
>             }
> 
EOT

ls -l react_gradle.patch
patch react.gradle react_gradle.patch

Dan solusi ini membantu saya membuat versi rilis: https://github.com/facebook/react-native/issues/26245#issuecomment -631382817

langkah-langkah berikut melakukannya untuk saya:

1. gradlew clean
2. npm install
3. gradlew bundleRelease
System:
    OS: macOS 10.15.3
    CPU: (4) x64 Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
    Memory: 221.64 MB / 8.00 GB
    Shell: 5.7.1 - /bin/zsh
  Binaries:
    Node: 12.13.1 - ~/.nvm/versions/node/v12.13.1/bin/node
    Yarn: 1.22.4 - ~/Documents/youpendo-app-bareworkflow/node_modules/.bin/yarn
    npm: 6.12.1 - ~/.nvm/versions/node/v12.13.1/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  Managers:
    CocoaPods: 1.9.3 - /usr/local/bin/pod
  SDKs:
    iOS SDK:
      Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
    Android SDK:
      API Levels: 28, 29
      Build Tools: 28.0.3, 29.0.2
      System Images: android-28 | Google APIs Intel x86 Atom, android-29 | Google APIs Intel x86 Atom
      Android NDK: Not Found
  IDEs:
    Android Studio: 3.6 AI-192.7142.36.36.6392135
    Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
  Languages:
    Java: 1.8.0_232 - /usr/bin/javac
    Python: 2.7.16 - /usr/bin/python
  npmPackages:
    @react-native-community/cli: ^4.8.0 => 4.10.0
    react: 16.11.0 => 16.11.0
    react-native: 0.62.2 => 0.62.2
  npmGlobalPackages:
    *react-native*: Not Found

Saya mendapatkan kesalahan yang sama. Ada solusi?

dapatkah seseorang membagikan file patch untuk react native 0.62.2

Saya telah membuat tambalan ini untuk React Native 0.63.2. Jika Anda memiliki 'drawable-' folder, mengubah nama itu untuk 'mipmap-', Anda dapat mengubah referensi untuk itu di android / app / src / main / AndroidManifest.xml

Jalankan ini di root proyek untuk membuat file patch

cat <<EOT >> react-native-0.63.2-react.gradle.patch 
@@ -147,6 +147,23 @@
                 jsSourceMapsDir.mkdirs()
             }

+            doLast {
+                def moveFunc = { resFolder ->
+                    File originalDir = file("\${buildDir}/generated/res/react/release/\${resFolder}");
+                    if (originalDir.exists()) {
+                        File destDir = file("\${buildDir}/../src/main/res/\${resFolder}");
+                        ant.move(file: originalDir, tofile: destDir);
+                    }
+                }
+                moveFunc.curry("drawable-ldpi").call()
+                moveFunc.curry("drawable-mdpi").call()
+                moveFunc.curry("drawable-hdpi").call()
+                moveFunc.curry("drawable-xhdpi").call()
+                moveFunc.curry("drawable-xxhdpi").call()
+                moveFunc.curry("drawable-xxxhdpi").call()
+                moveFunc.curry("raw").call()
+            }
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)
EOT

lalu oleskan tambalan dengan

patch node_modules/react-native/react.gradle < react-native-0.63.2-react.gradle.patch

Juga rekomendasikan untuk dilakukan

rm -Rf android/.gradle
cd android && gradlew clean

Salin node_ modules/react-native/react.gradle ke android/app/react.gradle , lalu ubah android/app/build.gradle dan android/app/react.gradle :

android/app/build.gradle

- apply from: "../../node_modules/react-native/react.gradle"
+ apply from: "./react.gradle"

android/app/react.gradle

           doFirst {
                jsBundleDir.deleteDir()
                jsBundleDir.mkdirs()
                resourcesDir.deleteDir()
                resourcesDir.mkdirs()
                jsIntermediateSourceMapsDir.deleteDir()
                jsIntermediateSourceMapsDir.mkdirs()
                jsSourceMapsDir.deleteDir()
                jsSourceMapsDir.mkdirs()
            }
+
+           doLast {
+               def moveFunc = { resSuffix ->
+                   File originalDir = file("${resourcesDir}/drawable-${resSuffix}")
+                   if (originalDir.exists()) {
+                      File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
+                       ant.move(file: originalDir, tofile: destDir)
+                   }
+               }
+               def moveRawFunc = { dir ->
+                  File originalDir = file("${resourcesDir}/${dir}")
+                  if (originalDir.exists()) {
+                      File destDir = file("$buildDir/../src/main/res/${dir}")
+                      ant.move(file: originalDir, tofile: destDir)
+                  }
+              }
+
+              moveFunc.curry("ldpi").call()
+              moveFunc.curry("mdpi").call()
+              moveFunc.curry("hdpi").call()
+              moveFunc.curry("xhdpi").call()
+              moveFunc.curry("xxhdpi").call()
+              moveFunc.curry("xxxhdpi").call()
+              moveRawFunc.curry("raw").call()
+          }

Ini berhasil untuk saya di react-native 0.63.2

            doLast {
                def flavorPathSegment = ""
                println targetName.toLowerCase();
                android.productFlavors.all { flavor ->
                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
                        flavorPathSegment = flavor.name
                    }
                }
                def moveFunc = { resFolder ->
                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
                    if (originalDir.exists()) {
                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
                        ant.move(file: originalDir, tofile: destDir);
                    }
                }

                moveFunc.curry("drawable").call()
                moveFunc.curry("drawable-ldpi").call()
                moveFunc.curry("drawable-mdpi").call()
                moveFunc.curry("drawable-hdpi").call()
                moveFunc.curry("drawable-xhdpi").call()
                moveFunc.curry("drawable-xxhdpi").call()
                moveFunc.curry("drawable-xxxhdpi").call()
                moveFunc.curry("raw").call()
            }


Di sini file patch react-native+0.63.2.patch

diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 6441d93..1eb4645 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -147,6 +147,33 @@ afterEvaluate {
                 jsSourceMapsDir.mkdirs()
             }

+            doLast {
+                def flavorPathSegment = ""
+                println targetName.toLowerCase();
+                android.productFlavors.all { flavor ->
+                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
+                        flavorPathSegment = flavor.name
+                    }
+                }
+                def moveFunc = { resFolder ->
+                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
+                    if (originalDir.exists()) {
+                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
+                        ant.move(file: originalDir, tofile: destDir);
+                    }
+                }
+
+                moveFunc.curry("drawable").call()
+                moveFunc.curry("drawable-ldpi").call()
+                moveFunc.curry("drawable-mdpi").call()
+                moveFunc.curry("drawable-hdpi").call()
+                moveFunc.curry("drawable-xhdpi").call()
+                moveFunc.curry("drawable-xxhdpi").call()
+                moveFunc.curry("drawable-xxxhdpi").call()
+                moveFunc.curry("raw").call()
+            }
+
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)
diff --git a/node_modules/react-native/scripts/.packager.env b/node_modules/react-native/scripts/.packager.env
new file mode 100644
index 0000000..21a13cf
--- /dev/null
+++ b/node_modules/react-native/scripts/.packager.env
@@ -0,0 +1 @@
+export RCT_METRO_PORT=8081
\ No newline at end of file

Halo semua! Bisakah seseorang membuat PR untuk perubahan ini? Mengedit node_modules tidak ideal.

Halo semua,

Saya menggunakan react-native 0.63.2. Saya juga menghadapi masalah ini dan mencoba mengedit react.gradle, menghapus resource / drawable, dan semuanya. Tapi akhirnya menjalankan perintah gradlew assembleRelease berhasil untuk saya.

Saya tidak menjalankan perintah bundel react-native. gradlew assembleRelease menjalankan bundel react-native dan membangun apk itu sendiri.

Ini berhasil untuk saya di react-native 0.63.2

            doLast {
                def flavorPathSegment = ""
                println targetName.toLowerCase();
                android.productFlavors.all { flavor ->
                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
                        flavorPathSegment = flavor.name
                    }
                }
                def moveFunc = { resFolder ->
                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
                    if (originalDir.exists()) {
                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
                        ant.move(file: originalDir, tofile: destDir);
                    }
                }

                moveFunc.curry("drawable").call()
                moveFunc.curry("drawable-ldpi").call()
                moveFunc.curry("drawable-mdpi").call()
                moveFunc.curry("drawable-hdpi").call()
                moveFunc.curry("drawable-xhdpi").call()
                moveFunc.curry("drawable-xxhdpi").call()
                moveFunc.curry("drawable-xxxhdpi").call()
                moveFunc.curry("raw").call()
            }

Di sini file patch react-native+0.63.2.patch

diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 6441d93..1eb4645 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -147,6 +147,33 @@ afterEvaluate {
                 jsSourceMapsDir.mkdirs()
             }

+            doLast {
+                def flavorPathSegment = ""
+                println targetName.toLowerCase();
+                android.productFlavors.all { flavor ->
+                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
+                        flavorPathSegment = flavor.name
+                    }
+                }
+                def moveFunc = { resFolder ->
+                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
+                    if (originalDir.exists()) {
+                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
+                        ant.move(file: originalDir, tofile: destDir);
+                    }
+                }
+
+                moveFunc.curry("drawable").call()
+                moveFunc.curry("drawable-ldpi").call()
+                moveFunc.curry("drawable-mdpi").call()
+                moveFunc.curry("drawable-hdpi").call()
+                moveFunc.curry("drawable-xhdpi").call()
+                moveFunc.curry("drawable-xxhdpi").call()
+                moveFunc.curry("drawable-xxxhdpi").call()
+                moveFunc.curry("raw").call()
+            }
+
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)
diff --git a/node_modules/react-native/scripts/.packager.env b/node_modules/react-native/scripts/.packager.env
new file mode 100644
index 0000000..21a13cf
--- /dev/null
+++ b/node_modules/react-native/scripts/.packager.env
@@ -0,0 +1 @@
+export RCT_METRO_PORT=8081
\ No newline at end of file

Terima kasih

Apakah halaman ini membantu?
0 / 5 - 0 peringkat