React-native: [Android] Fehler: Ressourcen duplizieren

Erstellt am 10. Nov. 2018  ·  103Kommentare  ·  Quelle: facebook/react-native

Umgebung

Native Environment Info reagieren:

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

Beschreibung

Ich kann keine Release-Apk mit dem PNG-Bild in Android erstellen. Kann aber eine Release-Apk erstellen, wenn kein PNG-Image darin ist. Hier ist der Fehler, den ich beim Generieren des Release-Builds erhalte

[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

Reproduzierbare Demo

  1. Erstellen Sie eine App - react-native init demo
  2. Erstellen Sie einen assets -Ordner im Projektstammordner.
  3. Fügen Sie ein PNG-Bild in den Assets-Ordner ein.
  4. Implementieren Sie nun eine image -Komponente mit dem obigen PNG-Image.
  5. Jetzt bündeln Sie es mit dem 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. Dann generiere release apk mit Generate Signed APK
Bug Android

Hilfreichster Kommentar

Die Antwort von Mapsy sollte https://stackoverflow.com/a/52750886 helfen
Sie bearbeiten also im Grunde die Datei
und fügen Sie den doLast direkt nach dem doFirst- Block manuell hinzu.

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()
}

Alle 103 Kommentare

Überprüfen Sie dies unter https://github.com/facebook/react-native/issues/19239#issuecomment -414564404

Sie müssen ein zeichnbares Ordnerbild entfernen, falls vorhanden?

@ ZeroCool00 wirkt sich das nicht auf die Bilder in Android aus?

Die Antwort von Mapsy sollte https://stackoverflow.com/a/52750886 helfen
Sie bearbeiten also im Grunde die Datei
und fügen Sie den doLast direkt nach dem doFirst- Block manuell hinzu.

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 Ich habe beide

Hallo zusammen, wie können wir das mit Jenkins Job schaffen? Da wird npm immer installiert, die diese Änderung in der Datei react.gradle überschreiben. Wir können Build-on-Android-Studio für Android erstellen, aber auf Jenkins nicht möglich.

Hi @ vivek-walecha-657 Ich habe dies nicht ausprobiert, aber Sie können diesen Befehl zum Erstellen einer Offline-Bündelung ausprobieren

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

@jeffreyrajanofficial Vielen Dank für das Schreiben. Die von Ihnen bereitgestellte Lösung hilft, wenn wir die Datei react.gradle ändern. Aber ich möchte die Veröffentlichung nicht machen, indem ich die Datei react.gradle jedes Mal ändere, wenn ich npm überall installiere.

@jeffreyrajanofficial Kannst du bitte sagen, welche Version (die neueste niedriger als diese oder höher als diese) ohne dieses Problem

Die Dinge werden jetzt in RN sortiert.> 57 Die Datei react.gradle erstellt automatisch das Bundle.
Zum Erstellen eines Release-Builds müssen Sie das npm run build: android : release nicht ausführen

Unter Verwendung der nativen Version 55.4 reagieren ist hier mein Beispielprojekt für build.gradle package.json mit Korrekturen.

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

Ich habe dies immer noch mit macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3 gesehen. Vielleicht bin ich nicht der einzige? Oder vielleicht kann jemand hier bestätigen, dass es funktioniert, also werde ich mehr graben und es für mich selbst reparieren.

Ich arbeite derzeit mit dem "Patch-Paket" -Paket in Kombination mit dem angehängten Patch daran, basierend auf dem obigen Kommentar von @mkchx (mit dem Suffix .txt damit Github den Anhang akzeptiert), um automatisch zu arbeiten Beheben Sie das Problem bei 'npm install', nachdem Sie meinen package.json-Skripten postinstall: patch-package hinzugefügt haben.

Vielleicht ist das für jemanden nützlich ...
React-Native + 0.57.8.patch.txt

Entfernen Sie die Dateien, die Sie möglicherweise haben:

android / app / src / main / res / drawable-mdpi /
android / app / src / main / res / drawable-xhdpi /
android / app / src / main / res / drawable-xxhdpi /
Führen Sie Build erneut aus. Dies hat das Problem für mich behoben.

Ich habe das immer noch in RN0.58.x gesehen und es geht weiter in RN0.59.x - machen wir hier etwas falsch oder ist das wirklich ein Fehler?

Ich habe weiterhin Erfolg mit der Problemumgehung von

React-Native + 0.59.1.patch.txt

Wenn Sie zusätzliche Ressourcen in benutzerdefinierten Ordnern hinzugefügt haben, möchten Sie möglicherweise Folgendes ausprobieren:

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()
}

Wenn Sie jedoch Abhängigkeiten haben, die ihre eigenen Assets packen, funktioniert dies nicht und es wird immer noch der folgende Fehler angezeigt (aus Gründen der Übersichtlichkeit bearbeitet):

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

Wird dies aktiv bewertet oder sollten wir mit unseren eigenen Patches vorankommen?

@dragosroua Ich sehe einen fehlenden Bindestrich in Ihrem xxxhdpi-Curry. Zufälligerweise die gleichen Leitpfade mit Problemen für Sie?

Du hast mich um 2 Minuten geschlagen, ich wollte gerade diesen Teil bearbeiten. Ja, jetzt ist alles in Ordnung, aber das Bit mit dem "rohen" Pfad für benutzerdefinierte Ressourcen könnte für jemanden nützlich sein.

@dragosroua froh, dass du jetzt kompilierst - ich erinnere mich, wie frustrierend dieses für mich war, und ich bin immer noch erstaunt, dass es nicht im Master behoben ist, obwohl ich auch keine PR vorgeschlagen habe, also denke ich, ich bekomme heraus, was ich hineingesteckt habe. ..

Ich habe dies immer noch mit macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3 gesehen. Vielleicht bin ich nicht der einzige? Oder vielleicht kann jemand hier bestätigen, dass es funktioniert, also werde ich mehr graben und es für mich selbst reparieren.

Ich arbeite derzeit mit dem "Patch-Paket" -Paket in Kombination mit dem angehängten Patch daran, basierend auf dem obigen Kommentar von @mkchx (mit dem Suffix .txt damit Github den Anhang akzeptiert), um automatisch zu arbeiten Beheben Sie das Problem bei 'npm install', nachdem Sie meinen package.json-Skripten postinstall: patch-package hinzugefügt haben.

Vielleicht ist das für jemanden nützlich ...
React-Native + 0.57.8.patch.txt

Bitte erklären Sie mir, warum es für mein React-Native 0.57.5 nicht funktioniert.
Ich habe eine Pacth-Datei erstellt. Zu package.json hinzugefügt. Führen Sie npm install aus und haben Sie das Ergebnis

        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

ohne notwendige Änderungen.

@zakabluk Sie müssten die Ausgabe Ihrer npm-Installation veröffentlichen, aber

Normalerweise erstelle ich Python-Skripte zum Patchen von node_modules.
Fügen Sie dies als postinstall.py und fügen Sie es Ihrem Postinstall-Skript hinzu oder führen Sie es mit ./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()

Hier können Sie bei Bedarf Ihre eigenen Skripte hinzufügen

Sieht aus wie eine Neuimplementierung dessen, was Sie mit npm install patch-package aber wenn Python Ihr Ding ist und Sie selbst mehr Code pflegen möchten, scheint es machbar. Ich benutze immer noch das Patch-Paket für das, was es wert ist, mit 0,59,3
React-Native + 0.59.3.patch.txt

@hramos - # 19239 war ähnlich (glaube ich) und dies ist langjährig, scheint aber eine Lösung zu haben. Benötigt dies nur eine PR für eine ultimative Lösung oder fehlt mir ein Grund, warum der hier verwendete Patch nicht funktionsfähig ist? (Ich könnte). Wenn wir nur eine PR brauchen, könnte ich eine einsenden ...

Sieht aus wie eine Neuimplementierung dessen, was Sie mit npm install patch-package aber wenn Python Ihr Ding ist und Sie selbst mehr Code pflegen möchten, scheint es machbar. Ich benutze immer noch das Patch-Paket für das, was es wert ist, mit 0,59,3
React-Native + 0.59.3.patch.txt

@hramos - # 19239 war ähnlich (glaube ich) und dies ist langjährig, scheint aber eine Lösung zu haben. Benötigt dies nur eine PR für eine ultimative Lösung oder fehlt mir ein Grund, warum der hier verwendete Patch nicht funktionsfähig ist? (Ich könnte). Wenn wir nur eine PR brauchen, könnte ich eine einsenden ...

Wie man diesen Weg benutzt, danke

@ZhanRu - https://github.com/ds300/patch-package#set -up - Sie möchten diesen Patch (mit der Erweiterung .patch) nur nach der Installation und Einrichtung von patch- in das Verzeichnis 'patches' in Ihrem Projekt einfügen. Paket

@ZhanRu - https://github.com/ds300/patch-package#set -up - Sie möchten diesen Patch (mit der Erweiterung .patch) nur nach der Installation und Einrichtung von patch- in das Verzeichnis 'patches' in Ihrem Projekt einfügen. Paket

Vielen Dank

Für alle, die noch mitmachen, habe ich kürzlich ein externes System integriert und musste meine Tests von externen Produktionsdaten trennen, was dazu führt, dass "Flavours" in Gradle verwendet werden, damit qaDebug, stagingRelease usw. usw. auf ein anderes externes System verweisen können. Der Patch hier hat dies jedoch nicht unterstützt, daher habe ich Geschmacksunterstützung hinzugefügt, und mein Patch sieht jetzt so aus. Es lebt in patches/react-native+0.59.5.patch wo es angewendet wird, während npm i nach npm install patch-package läuft

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)

In meinem Fall bleibt das Problem mit dem Verzeichnis raw .

Version: react-native 0.59.5

Meine Lösung:

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()
}

Grüße

@Dbroqua Ihre Lösung hat bei mir funktioniert (Version react-native 0.59.5 ). Vielen Dank.

Sehr interessant - ich hatte kein Problem mit Raw - beachten Sie, dass meine neueste Version des Patches Unterstützung für Aromen hinzufügte. Wenn Sie anfangen, Aromen zu machen, möchten Sie diese Geschmacksunterstützung jetzt in diesen beiden Funktionen. Vielleicht könnte es irgendwie parametrisiert werden, damit sich die beiden Funktionen nicht so oft wiederholen, aber ich bin nicht gut genug im Grooving, um darüber nachzudenken.

Ich kann mir nur vorstellen, dass dies kein Problem bei Facebook und reaktionsnativen CIs ist, da sie BUCK verwenden und ihre CI-Builds jedes Mal sauber sind. Hat jemand eine saubere Reproduktion davon, damit wir einen Fix Upstream bekommen können?

In meinem Fall enthält das Raw-Verzeichnis einige MP3s, die in meiner Anwendung verwendet werden.

Das könnte dann die Basis für einen schnellen und einfachen Repro bilden. Ich habe (noch) keine derartigen Assets, aber es ist einfach genug, native Init für ein Repo zu reagieren. Setzen Sie einige Assets ein, und ich denke, beim zweiten Release-Build (vielleicht sogar beim ersten?) Sind Sie abgespritzt ...

@Dbroqua nur ein Kopf hoch, mein Patch wurde zusammengeführt, aber Ihre Erwähnung von Rohverzeichnissen, die sehr eng miteinander verwandt sind, aber nicht in meinem Patch enthalten sind, spiegelt sich auch in der Zusammenführung wider. Nachdem mein Patch installiert ist, möchten Sie möglicherweise sehen, welche Änderungen für das Raw-Verzeichnis erforderlich sind, und einen PR mit einer Fortsetzung des Fixes vorschlagen, der für Ihren Fall erweitert wird.

In Ordnung,

Ich werde das Notwendige so schnell wie möglich tun.

Grüße,
Damien

Fest!

In meinem Fall befanden sich Dateien in den Drawables-Verzeichnissen res/drawable-* , die von einem anderen Entwickler in meinem Team-Commit verweilten. Ich erhielt den Fehler "Fehler: Doppelte Ressourcen", der auf diese Dateinamen zeigte. Ich habe die Dateien aus Drawables gelöscht und alles funktioniert gut 👍

Die Antwort von Mapsy sollte https://stackoverflow.com/a/52750886 helfen
Sie bearbeiten also im Grunde die Datei
und fügen Sie den doLast direkt nach dem doFirst- Block manuell hinzu.

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()
}

Ich arbeite nicht für mich.

@ Nextt1 Sie müssen eine neue Ausgabe eröffnen - wenn möglich mit einem reproduzierbaren Testfall in einem öffentlichen Repo - und möglicherweise eine neue PR vorschlagen. Dieses Problem wurde von meiner PR geschlossen, und dann wurde ein weiteres Problem (das einen Fall behandelt, in dem meine erste PR nicht gut behandelt wurde) zusammengeführt. Wir sind also alle weitergegangen und ich denke, es funktioniert für die meisten, sodass dieses Problem wahrscheinlich nicht auftritt Beachtung.

Hallo allerseits - die PR, die ich vorgeschlagen habe, um dies zu beheben, wurde zusammengeführt, verursacht aber anscheinend eine Regression - https://github.com/facebook/react-native/issues/25325 - Ich untersuche, aber ob es hier jetzt Gradle-Gurus gibt Wie Sie dieses Problem beheben können, ohne diese Regression zu verursachen, wäre dankbar - danke!

Okay, die zugehörige PR hier wird eine "PR zurücksetzen" haben - sie verursacht eine Regression, und das zugrunde liegende Problem, das dieses Problem verursacht hat, war wirklich eine schlechte Dokumentation.

Hier ist die Sache: Sie sollten während eines Builds niemals wirklich Dinge in das src-Verzeichnis kopieren. Sie müssen Dinge in Zwischenprodukte kopieren und generieren usw. Wenn Sie bereits Dinge in src kopiert haben (aus früheren Builds, die diesen Patch verwenden, oder aus einem reaktionsnativen Bundle-Befehl): Sie müssen diese löschen, damit src / main / res Verzeichnis ist sauber - nur echte Assets aus Ihrem Projekt

Um eine APK mit einem Offline-Bundle zu erstellen - auch in dev, damit Sie es auf API <17 ausführen können - sollten Sie die Dinge anders machen, als es jeder im Web empfiehlt (oder Sie haben dieses Problem).

Was Sie wollen, ist dies in Ihrem 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
]

Dann rufen Sie react-native ungefähr so ​​auf - Senden einer Gradle-Projekteigenschaft über eine Umgebungsvariable:
ORG_GRADLE_PROJECT_bundleInDebug=true npx react-native run-android

(oder für Varianten wie diese ORG_GRADLE_PROJECT_bundleInDevDebug=true npx react-native run-android --variant devDebug )

Ich habe dies immer noch mit macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3 gesehen. Vielleicht bin ich nicht der einzige? Oder vielleicht kann jemand hier bestätigen, dass es funktioniert, also werde ich mehr graben und es für mich selbst reparieren.

Ich arbeite derzeit mit dem "Patch-Paket" -Paket in Kombination mit dem angehängten Patch daran, basierend auf dem obigen Kommentar von @mkchx (mit dem Suffix .txt damit Github den Anhang akzeptiert), um automatisch zu arbeiten Beheben Sie das Problem bei 'npm install', nachdem Sie meinen package.json-Skripten postinstall: patch-package hinzugefügt haben.

Vielleicht ist das für jemanden nützlich ...
React-Native + 0.57.8.patch.txt

Genial! Im Moment ist es die beste Antwort!

Ich sehe das immer noch in 0.59.9. Die Antwort von @mkchx hat das Problem für mich

@juliancorrea @scgough sei nur vorsichtig damit, ich folgte diesem Lösungsstil bis zum Ende mit einer sogar akzeptierten PR, aber nach Folgeproblemen mussten wir ihn zurücksetzen. Es ist eine Sackgasse. Ich habe einige Details oben zu den derzeit empfohlenen Lösungen veröffentlicht und kann nur den neuen Stil empfehlen. Wenn Sie meinen alten angehängten Patch verwenden, der auf der Antwort von @mkchx basiert, vorerst für Sie, jedoch nur unter bestimmten Bedingungen - er schlägt in anderen gängigen Szenarien fehl, die Ihr Projekt möglicherweise in Zukunft benötigt

@mikehardy OK - Ich werde mir jetzt Ihre Lösung ansehen.
Ich denke, was ich eigentlich will, ist, dass der signierte APK-Build von Android Studio das Bundle überspringt (da ich dies manuell über das Terminal mache).
Ich werde mir die von Ihnen angegebenen Einstellungen ansehen und prüfen, ob sie helfen.

Ich habe immer noch Probleme damit ...
Ich kann meine Release-APK-Datei scheinbar nicht erstellen. Ich erhalte für jede Asset-Datei den folgenden Fehler:

[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 : Fehler: Ressourcen duplizieren

Ich habe beide Instanzen von drawable-mdpi -Ordnern gelöscht, aber die APK-Generation legt sie zurück und Fehler.
Ich führe Folgendes manuell aus, um mein Bundle zu erstellen:

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/

In meinem App-Gradle habe ich:

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

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

Nur als zusätzliche Information - meine App funktioniert gut beim Debuggen (über react-native run-android )
Im Moment kann ich meine Release-APK nur über das oben beschriebene doLast PR-Update erstellen.

Ich denke, ich könnte zumindest den Grund / die Lösung für mein Problem haben.

Mein alter Bundle-Befehl (den ich seit RN 0.2.x verwendet habe?!) Hat die Assets in den Zielordner android/app/src/main/res/ verschoben

Ich habe einen Beitrag unter dem folgenden Link notiert, der besagt, dass> RN 57 tatsächlich Assets benötigt, die in den folgenden Ordner verschoben werden:
android/app/build/intermediates/res/merged/release/

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

Ich habe folgendes gemacht:

  • löschte die drawable-mdpi Assets, die in android/app/src/main/res/ kopiert wurden
  • Mein Bundle-Befehl wurde aktualisiert, um den neuen Ordner zu verwenden
  • Meine APK wird jetzt erstellt ... (_ Ich bin dabei, sie zu testen_)

aktualisieren
Die APK wurde installiert, aber die App stürzt jetzt mit der Ausnahme ab:
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'defaultSrc' of a view managed by: RCTImageView

... so sieht es so aus, als ob es die Bilder nicht finden kann 😞

Update 2
Die einzige Möglichkeit, die APK (bisher) zum Laufen zu bringen, besteht darin, Folgendes zu tun:

  • Setzen Sie meinen Bundle-Aufruf zurück, um Folgendes für Assets zu verwenden: android/app/src/main/res/
  • Führen Sie den Befehl bundle aus
  • Benennen Sie die android/app/src/main/res/drawable-mdpi in android/app/src/main/res/drawable-hdpi
  • Erstellen Sie die signierte APK

Mein Build Gradle ist:

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

Die APK erstellt und läuft dann ...

Randnotiz:
Ich habe einen unerwarteten Fehler festgestellt, der zu einer createBitmap OutOfMemory-Ausnahme für eine Bildschiebereglerkomponente führte.
Ich habe meinem Manifest Folgendes hinzugefügt und die App wird erneut ausgeführt: android:largeHeap="true"
Ich bin mir bewusst, dass durch das Hinzufügen ein Leck- / Komponentenproblem umgangen wird, aber die App wird bisher wieder ohne Probleme ausgeführt.

In React Native 0.60.0 habe ich festgestellt, dass die native Basis auch doppelte Ressourcen erstellt, aber die oben beschriebene Problemumgehung funktioniert nicht, da sie auf den Rohordner abzielt.

[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: \ Projekte \ some-app \ CLIENT \ android \ app \ build \ generate \ res \ reactreleaserawnode_modules_nativebase_dist_src_basic_icon_nbicons.json: Fehler: Duplizieren

Für andere Benutzer mit diesem Problem:

        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);
            }
        }

Wie können wir das lösen, wenn wir CI verwenden?

In meinem Fall bleibt das Problem mit dem Verzeichnis raw .

Version: react-native 0.59.5

Meine Lösung:

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()
}

Grüße

Das funktioniert!

[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

Ich erhalte diesen Fehler, wenn ich react-native run-android ausführe, aber nicht, wenn ich den Release-Build erstelle und ausführe. Keine der oben genannten Lösungen funktioniert für mich.

RN 0,60,5

UPDATE: Mir wurde klar, dass ich die obigen "Patch" -Methoden ändern sollte, um die Verzeichnisse debug anstelle von release zu zitieren, und das hat es behoben. Ich musste auch mein raw Verzeichnis reparieren

Ich habe auch das gleiche Problem und reagiere. Der Patch gradle wird es nicht beheben. In meinem Fall sind meine duplizierten Ressourcen .OBJ- und .MTL-Dateien. Sie haben keine Probleme mit Bildressourcen.

[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 / Dt /android/app/src/main/res/raw/assets_res_salad_salad.obj: Fehler: Doppelte Ressourcen
[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: Fehler: Ressourcen duplizieren
[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 / Dt /android/app/src/main/res/raw/assets_res_salmon_salmon.obj: Fehler: Doppelte Ressourcen

@sercanov versuchen Sie immer noch, die Kopie zu src zu verwenden? Dieser Stil wurde untersucht und schlägt aus bekannten Gründen fehl. Es gibt unterstützte Methoden zum Erstellen, die keine Dinge in src platzieren - oder versuchen Sie diese Methoden, die nicht in src kopiert werden sollen, und scheitern immer noch? https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

hey @mikehardy hat tatsächlich beide Ansätze ausprobiert, keiner von beiden hat es in Release-Builds zum

Bei Verwendung der Methode "Nicht kopieren nach src" ORG_GRADLE_PROJECT_bundleInArRelease=true npx react-native run-android --variant arRelease bekomme ich diese;

Ausführung für Aufgabe ': 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 / resources_res_salad_salad] / Users / sercan /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.obj: Fehler: Doppelte Ressourcen
[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: Fehler: Doppelte Ressourcen
[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 / sercan /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.obj: Fehler: Ressourcen duplizieren

Bei Verwendung von copy-to-src doLast way; Ich musste den Android / Build-Ordner jedes Mal löschen, um erfolgreich zu sein, aber irgendwie waren keine Assets in der App verfügbar. Dies hängt möglicherweise mit meinem Code zusammen, der derzeit untersucht wird.

Wenn Sie auf die Methode "Nicht kopieren nach src" wechseln, müssen Sie zuerst alles bereinigen, um den Wechsel vorzunehmen. Mein Projekt hatte viel "Abfall" aus einer Bündelungsperspektive aus dem vorherigen Copy-to-Src-Stil, den ich bereinigen musste, bevor es funktionierte, und dann funktionierte es jedes Mal.

@ rahulkumar1409 das hat mir bei diesem Fehler geholfen, aber es wirft einen anderen Fehler

Aufgabe : React -Native-Simple-Download-

Haben Sie eine Idee, warum dies passiert?

Diese Lösung hat bei mir funktioniert.
Sie bearbeiten also im Grunde die Datei /node_modules/react-native/react.gradle
und fügen Sie den doLast direkt nach dem doFirst-Block manuell hinzu.

doFirst {...}
doLast {
def moveFunc = {resSuffix ->
Datei originalDir = Datei ("$ buildDir / generate / res / react / release / drawable - $ {resSuffix}");
if (originalDir.exists ()) {
Datei destDir = Datei ("$ buildDir /../ src / main / res / drawable - $ {resSuffix}");
ant.move (Datei: 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 ()
}}

Wir sind auf reaktionsnativen 0,60,5.

Wir verwenden Produktaromen wie bei @mikehardy erwähnt und hatten Probleme mit dem ' raw' -Ordner, genau wie bei

Am Ende habe ich beide Lösungen gemischt und wir verwenden diesen Code:

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()
}

Dieser Thread war wirklich hilfreich, danke an alle für ihren Beitrag. 😄

Ich erhalte den doppelten Fehler nur bei Release-Builds. Ich verwende React-Native 60.5

/release/drawable-xhdpi/node_modules_reactnavigationstack_lib_module_views_assets_backicon.png: Fehler: Doppelte Ressourcen

Ich habe versucht, bundleInDebug auf true und false zu setzen, aber ohne Auswirkungen.

Ich baue mit App Center. Dies erfordert eine src / main / assets / appcenter-config.json-Datei. Ich habe auch ein Verzeichnis src / main / assets / fonts, da ich benutzerdefinierte Schriftarten verwende. Ist dies wahrscheinlich das Problem zu verursachen?

@ARichIVC Ich

Es sieht so aus, als ob das Standardproblem "Mein src / -Verzeichnis ist durch frühere Versuche im Kopierstil verschmutzt, Bundle-Verpackungen zu handhaben" aus dieser ursprünglichen Lösung stammt, bevor wir alle erkannten, dass es sich um eine Sackgasse handelt und Sie src / aus den kopierten löschen müssen Dinge, bevor Sie die nachfolgende Lösung für das BundleInDebug-Zeug ausprobieren. Es ist alles in diesem Thread, der leider unhandlich und lang ist, aber die Informationen sind da drin

Danke @mikehardy für deine Hilfe. Ich fand es in Ordnung, die Schriftarten usw. im Assets-Verzeichnis zu belassen, musste aber die anderen herumhängenden Teile löschen. Nämlich alles in \ android \ app \ src \ main \ res \ drawable-hdpi \

Beachten Sie, dass sich Schriftarten auch im richtigen Verzeichnis befinden sollten - ein Beispiel: https://github.com/oblador/react-native-vector-icons#android, mit dem Sie aufgefordert werden, diese Datei aufzurufen, die sorgfältig in ein Nicht-src kopiert wird Verzeichnis https://github.com/oblador/react-native-vector-icons/blob/master/fonts.gradle#L16 - jedes Projekt ist natürlich anders, aber ich fand es erwähnenswert

Wir sind auf reaktionsnativen 0,60,5.

Wir verwenden Produktaromen wie bei @mikehardy erwähnt und hatten Probleme mit dem ' raw' -Ordner, genau wie bei

Am Ende habe ich beide Lösungen gemischt und wir verwenden diesen Code:

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()
}

Dieser Thread war wirklich hilfreich, danke an alle für ihren Beitrag. 😄

Es klappt! Vielen Dank! 👍

Für React Native 0.59.1 oder höher müssen Sie den folgenden Code in react.gradle in node_modules / react-native hinzufügen.

für aromatisierte Verwendung unter Code.

        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 diesen schlechten Rat. Diese Stillösung wurde bis zu dem Punkt verfolgt, an dem sie eine PR hatte und sogar zusammengeführt wurde. Dann wurde festgestellt, dass es die falsche Richtung war und die PR wurde zurückgesetzt. Würden Sie den Leuten raten, eine Lösung zu verwenden, die tatsächlich dazu geführt hat, dass eine PR-Zusammenführung rückgängig gemacht wurde? Ich würde nicht. https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

@mikehardy Ja, ich weiß, dass dies keine dauerhafte Lösung ist, aber es funktioniert gut. Außerdem kann ich Ihre Lösung nicht verwenden, da ich einige andere Dateien wie Begrüßungsbildschirme und DB im Verzeichnis res habe .

Ja @ dayachand-systematix mich auch:

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

Und trotzdem funktioniert die vorgeschlagene / nicht PR-zurückgesetzte Lösung für mich: man_shrugging:

Heya, wir haben das Problem behoben, indem wir den 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 - würde das Entfernen des Parameters --asset-dest nicht dazu führen, dass die neuesten Assets nicht an der richtigen Stelle gebündelt werden. Wenn Sie also Ihre APK erstellen, besteht die Gefahr, dass sie fehlen / fehlen Datum Asset-Dateien in der App?

@scgough Ich dachte, das könnte der Fall sein. In diesem Fall können wir alle doppelten Assets mit Ausnahme der lokalen Assets, die wir vor dem Erstellen mit Android Studio oder einem beliebigen Produktionsworkflow benötigen, selektiv entfernen, z

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

Nicht ideal, aber es sollte funktionieren, bis dies behoben ist.

Dieses Problem tritt auf, wenn Sie Dateien mit demselben Namen und unterschiedlicher Erweiterung in einem solchen Assets-Ordner haben

back.png
back.jpg

weil in android beide so anrufen;

R.drawable.back
R.drawable.back

Entfernen oder benennen Sie eine der Dateien um.

Hallo,
Ich habe versucht, react.gradle zu ändern: Der Build geht noch einen Schritt weiter (die app.aab wird erstellt, aber ich kann die APK nicht erstellen.

Ich habe versucht, die APK mit Android Studio zu erstellen, und es gab kein Problem (mit dem Patch zu react.gradle).
Es ist ziemlich seltsam für mich, weil der Prozess zum Erstellen der APK in beiden Fällen der gleiche sein sollte. Liege ich falsch ?

Dieser Kommentar funktionierte für 0.59.10. Mit diesem Kern gemischt .

Vielen Dank, @ dayachand-systematix!

Was für mich funktioniert hat, war eine Kombination aus zwei Kommentaren:

Ich füge dies hier für jeden ein, der es sonst noch braucht.

`` `
def flavourPathSegment = ""
android.productFlavors.all {Flavor ->
if (targetName.toLowerCase (). enthält (flavour.name)) {
FlavorPathSegment = Flavour.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 wo

@AbhishekNairOfficial wo

node_modules / react-native / react.gradle.

Setzen Sie dies nach dem doFirst () -Block

@AbhishekNairOfficial wo

node_modules / react-native / react.gradle.

Setzen Sie dies nach dem doFirst () -Block

Ich denke, es ist nicht der richtige Weg, um dieses Problem zu umgehen. Weil diese Änderung beim nächsten npm install überschrieben wird. Auch das CI wird nicht funktionieren

Hat jemand unten Befehle ausprobiert?

cd android
./gradlew clean
cd ..

Es hat bei mir funktioniert

Was für mich funktioniert hat, war eine Kombination aus zwei Kommentaren:

Ich füge dies hier für jeden ein, der es sonst noch braucht.

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 Mann, du hast meinen Tag gerettet <3

Was für mich funktioniert hat, war eine Kombination aus zwei Kommentaren:
Ich füge dies hier für jeden ein, der es sonst noch braucht.

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 Mann, du hast meinen Tag gerettet <3

Haha danke. Ich bin fast täglich zu diesem Thema gekommen, also habe ich beschlossen, das Leben auch anderen zu erleichtern.

Das Entfernen des Ordners android/app/build und das erneute Erstellen funktionierten für mich.

Meine Lösung:
Löschen Sie alle Dateien in / your_project / android / app / src / main / raw / res .
Es ist Arbeit für mich!

Was für mich funktioniert hat, war eine Kombination aus zwei Kommentaren:

Ich füge dies hier für jeden ein, der es sonst noch braucht.

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()
            }

danke @AbhishekNairOfficial. Das hat mir viel Zeit gespart.

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

Das funktioniert also, aber dann fehlen Ihre Bilder. Wenn Sie also Ihre App neu bündeln und versuchen, sie zu erstellen, wird der gleiche Fehler angezeigt. Hat jemand schon eine legitime Lösung dafür?

Dasselbe in Version 0.61.5 und wie @ wincod75 sagt, ist das Löschen von unformatierten und zeichnbaren Ordnern keine wirkliche Lösung, da alle Bilder entfernt werden.

Ich verstehe, dass sie für den Release-Build neu erstellt wurden, aber es wäre schön, wenn sie auch funktionieren würden, wenn reaktionsnatives run-android ausgeführt wird - varant = release, das funktioniert nur, wenn sie sich in src / main befinden, und es kann nicht erstellt werden .

Konnte jemand auf v0.61.5 lösen?

@ gudbrand3 Ich habe schließlich den oben genannten Fix in die Datei "node_modules / react-native / react.gradle" implementiert, nur damit ich einen neuen Build für den Appstore erhalten kann, aber das ist absurd, nicht sicher, warum dies nicht der Fall ist wurde noch nicht behoben ...

@ wincod75 hören hören! Am Ende hatte ich das gleiche ... bla. Ich verstehe auch nicht, warum es nicht nur im Paket enthalten ist, bis ein besserer Ansatz gefunden wird, da die Leute es sowieso manuell machen. Jetzt muss es bei jedem Löschen von node_modules und jeder erneuten npm-Installation erneut durchgeführt werden. #frustrierend

Das Entfernen der Zeichenordner würde für mich nicht funktionieren, da ich Zeichenressourcen hatte, die ich behalten musste. Mein Problem war mit duplicate resources für alles im Ordner android/app/src/main/res/raw und Dateien, die mit nodemodules... im Ordner android/app/src/main/res/drawable begannen. Dies löste das Problem für mich:

Hinzufügen zu android/app/build.gradle :

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

Alles, was mit node von android/app/src/main/drawable* entfernen:

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

Bereinigen Sie das Projekt, führen Sie den Befehl REACT NATIVE BUNDLE NICHT aus und erstellen Sie ihn neu.

Hoffe das hilft jemandem!

Oh Junge. Vielleicht ist eine offizielle Lösung in Vorbereitung?

Ich habe das gleiche Problem in Version 0.61.4

in meinem Fall
Erstens: Ich habe den folgenden Code in node_modules / react-native / react.gradle nach 'doFirst' eingefügt.

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()
}

zweitens: Ich habe alle Inhalte des Ordners android / app / src / main / res / raw gelöscht
kann für jemanden nützlich sein

Oh Junge. Vielleicht ist eine offizielle Lösung in Vorbereitung?

Ich hoffe es, ich verwende RN 0.62.1 und bin auch auf dieses Problem

Durch Hinzufügen des doLast-Codes oder Löschen der Drawables-Ordner wird dieses Problem

Ich frage mich, was die offizielle Empfehlung ist.

Vielen Dank

Das Entfernen der Zeichenordner würde für mich nicht funktionieren, da ich Zeichenressourcen hatte, die ich behalten musste. Mein Problem war mit duplicate resources für alles im Ordner android/app/src/main/res/raw und Dateien, die mit nodemodules... im Ordner android/app/src/main/res/drawable begannen. Dies löste das Problem für mich:

Hinzufügen zu android/app/build.gradle :

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

Alles, was mit node von android/app/src/main/drawable* entfernen:

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

Bereinigen Sie das Projekt, führen Sie den Befehl REACT NATIVE BUNDLE NICHT aus und erstellen Sie ihn neu.

Hoffe das hilft jemandem!

Die obige Lösung hat mir geholfen, eine anständige Antwort zu finden:

Schritt 1:

Hinzufügen zu android/app/build.gradle :

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

Schritt 2:

Führen Sie den folgenden Befehl aus, um alle node_module-Dateien zu löschen.

rm -rf drawable*/node*

Schritt 3:

Führen Sie diesen Befehl aus, um und APK zu erstellen.

./gradlew assembleRelease

Schritt 4:

Ich habe das folgende Skript für meine package.json erstellt

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

Hoffe das hilft!
Und vielen Dank an alle, die mit ihren Lösungen mitgemacht haben

Für alle, die Probleme mit Nicht-Image-Rohstoffen haben; Ich habe es gelöst, indem ich die Dateien mit demselben Namen, aber unterschiedlicher Erweiterung umbenannt habe.

Mein Fall

Ich hatte object.obj und object.mtl Dateien. Selbst wenn die Erweiterungen unterschiedlich sind, wurde ein Fehler bei doppelten Ressourcen ausgelöst. Weil Android sie nach Dateinamen aufnimmt. Das Umbenennen von object.mtl in object_material.mtl hatte es also endlich für mich gelöst.

Dies kann auch für Bildressourcen der Fall sein. Versuchen Sie, sie umzubenennen, wenn Sie Bilder mit identischen Namen haben.

Was für mich funktioniert hat, war eine Kombination aus zwei Kommentaren:

Ich füge dies hier für jeden ein, der es sonst noch braucht.

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()) arbeiten für mich.
Mein flavor.name sieht aus wie xxXX.

All dieses Dolast-Zeug wurde in den PRs Nr. 24518 und Nr. 24778 hinzugefügt und dann in Nr. 25363 wieder entfernt. Weiß jemand, warum es entfernt wurde? Dies war ein langjähriges Problem, und ich dachte, sie hätten es behoben.

Egal, Antworten hier:
https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
und hier: https://github.com/facebook/react-native/issues/25325

Falls das hilft, hier ein paar Einzeiler aus meinem Skript (auch für Android X):

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

Diese Lösung hat mir geholfen, einen Release-Build zu erstellen: https://github.com/facebook/react-native/issues/26245#issuecomment -631382817

Die folgenden Schritte haben es für mich getan:

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

Ich erhalte den gleichen Fehler. Irgendeine Lösung ?

Kann jemand bitte die Patch-Datei für die Reaktion native 0.62.2 teilen

Ich habe diesen Patch für React Native 0.63.2 erstellt. Wenn Sie 'drawable- ' Ordner haben, benennen Sie diese in 'mipmap-' um . Sie können die Referenz in der Datei android / app / src / main / AndroidManifest.xml ändern

Führen Sie dies im Stammverzeichnis des Projekts aus, um die Patch-Datei zu erstellen

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

Wenden Sie dann den Patch mit an

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

Auch empfehlen zu tun

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

Kopieren Sie node_ modules/react-native/react.gradle nach android/app/react.gradle und ändern Sie dann android/app/build.gradle und 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()
+          }

Dies funktioniert bei mir in 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()
            }


Hier die Patch-Datei 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

Hallo zusammen! Könnte jemand eine PR für diese Änderungen machen? Das Bearbeiten von node_modules ist nicht ideal.

Hallo zusammen,

Ich verwende reaktionsnatives 0.63.2. Ich war auch mit diesem Problem konfrontiert und habe versucht, react.gradle zu bearbeiten, Ressourcen / drawable und alles zu löschen. Aber endlich hat das Ausführen des Befehls gradlew assembleRelease für mich funktioniert.

Ich habe den Befehl "Reale-Native Bundle" nicht ausgeführt. gradlew assembleRelease führt das reaktionsnative Bundle aus und erstellt apk selbst.

Dies funktioniert bei mir in 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()
            }

Hier die Patch-Datei 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

Dankeschön

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen