React-native: [Android] Erreur: ressources en double

Créé le 10 nov. 2018  ·  103Commentaires  ·  Source: facebook/react-native

Environnement

Informations sur l'environnement natif de 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

La description

Je ne suis pas en mesure de créer une version apk avec l'image PNG dans Android. Mais peut être capable de créer une version apk lorsqu'il n'y a pas d'image PNG. Voici l'erreur que j'obtiens lors de la génération de la version de version

[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

Démo reproductible

  1. Créer une application - react-native init demo
  2. Créez un dossier assets dans le dossier racine du projet.
  3. Ajoutez une image PNG dans le dossier des ressources.
  4. Maintenant, implémentez un composant image avec l'image PNG ci-dessus.
  5. Maintenant, regroupez-le en utilisant le 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. Générez ensuite une version apk en utilisant Generate Signed APK
Bug Android

Commentaire le plus utile

La réponse de Mapsy devrait aider https://stackoverflow.com/a/52750886
Donc, fondamentalement, vous éditez le fichier /node_modules/react-native/react.gradle
et ajoutez le doLast juste après le bloc doFirst , manuellement.

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

Tous les 103 commentaires

vérifiez ceci https://github.com/facebook/react-native/issues/19239#issuecomment -414564404

Vous devez supprimer l'image du dossier dessiné s'il y en a?

@ ZeroCool00 n'affectera-

La réponse de Mapsy devrait aider https://stackoverflow.com/a/52750886
Donc, fondamentalement, vous éditez le fichier /node_modules/react-native/react.gradle
et ajoutez le doLast juste après le bloc doFirst , manuellement.

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 J'ai vérifié avec vos deux réponses, cela fonctionne. Merci beaucoup les gars :)

Salut à tous, comment pourrons-nous y parvenir avec le travail de Jenkins. Comme il le fera, npm installera toujours ce qui remplace cette modification dans le fichier react.gradle. Nous pouvons créer une compilation sur Android Studio pour Android, mais pas possible sur jenkins.

Salut @ vivek-walecha-657 Je n'ai pas essayé cela mais vous pouvez essayer cette commande pour créer un regroupement hors ligne

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

@jeffreyrajanofficial Merci pour l'écriture, la solution que vous avez fournie nous aidera si nous allons changer le fichier react.gradle. Mais je ne veux pas faire la publication en changeant le fichier react.gradle chaque fois que je fais l'installation de npm partout.

@jeffreyrajanofficial Pouvez-vous s'il vous plaît dire quelle version (la dernière version inférieure ou supérieure à celle-ci) fonctionne correctement, sans ce problème. Parce que les notes de publication ne disent rien que ce problème est résolu.

Les choses sont maintenant triées dans RN> 57, le fichier react.gradle crée automatiquement le bundle.
pour créer une version de version, vous n'avez pas besoin d'exécuter la version d' exécution de npm : android : release

En utilisant la version native 55.4 react, voici mon exemple de projet pour package.json avec des correctifs.

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

Je voyais toujours cela, en utilisant macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. Peut-être que je ne suis pas le seul? Ou peut-être que quelqu'un ici peut confirmer que cela fonctionne alors je vais creuser plus et le réparer moi-même pour de vrai.

Je travaille actuellement autour de cela avec le package "patch-package" en combinaison avec le patch ci-joint basé sur le commentaire ci-dessus de @mkchx (avec le suffixe .txt ajouté pour que github accepte la pièce jointe) afin de pouvoir automatiquement corrigez-le sur 'npm install' après avoir ajouté postinstall: patch-package à mes scripts package.json.

Peut-être que cela est utile à quelqu'un ...
react-native + 0.57.8.patch.txt

Supprimez les fichiers que vous pourriez avoir sur:

android / app / src / main / res / drawable-mdpi /
android / app / src / main / res / drawable-xhdpi /
android / app / src / main / res / drawable-xxhdpi /
Exécutez à nouveau Build, cela a résolu le problème pour moi.

Je voyais toujours cela dans RN0.58.x et cela continue dans RN0.59.x - faisons-nous quelque chose de mal ici ou est-ce vraiment un bogue?

Je continue à avoir du succès avec la solution de contournement de @mkchx encodée sous forme de correctif dans le répertoire des correctifs à utiliser avec le module patch-package et ce correctif (mis à jour pour RN0.59.1)

react-native + 0.59.1.patch.txt

Si vous avez des ressources supplémentaires ajoutées dans des dossiers personnalisés, vous pouvez essayer quelque chose comme ceci:

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

Mais si vous avez des dépendances qui emballent leurs propres actifs, cela ne fonctionne pas, mais cette erreur continue (modifiée pour plus de clarté):

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

Est-ce activement évalué ou devrions-nous aller de l'avant avec nos propres correctifs?

@dragosroua Je vois un trait d'union manquant dans votre curry xxxhdpi. Par coïncidence, les mêmes chemins principaux avec des problèmes pour vous?

Tu m'as battu de 2 minutes, j'étais sur le point d'éditer cette partie. Oui, tout va bien maintenant, mais le bit avec le chemin "brut" pour les ressources personnalisées peut être utile pour quelqu'un.

@dragosroua heureux que vous

Je voyais toujours cela, en utilisant macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. Peut-être que je ne suis pas le seul? Ou peut-être que quelqu'un ici peut confirmer que cela fonctionne alors je vais creuser plus et le réparer moi-même pour de vrai.

Je travaille actuellement autour de cela avec le package "patch-package" en combinaison avec le patch ci-joint basé sur le commentaire ci-dessus de @mkchx (avec le suffixe .txt ajouté pour que github accepte la pièce jointe) afin de pouvoir automatiquement corrigez-le sur 'npm install' après avoir ajouté postinstall: patch-package à mes scripts package.json.

Peut-être que cela est utile à quelqu'un ...
react-native + 0.57.8.patch.txt

Veuillez m'expliquer pourquoi pour mon 0.57.5 natif de réaction, cela ne fonctionne pas?
J'ai créé le fichier pacth. Ajouté à package.json. Exécutez npm install et a comme résultat

        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

sans modifications nécessaires.

@zakabluk vous auriez besoin de publier la sortie de votre installation npm, mais comme une supposition, c'est parce que le package patch-package est très prudent avec les numéros de version. vous essayez sur 57,5, mais le patch est contre 57,8?

Je crée généralement des scripts python pour patcher node_modules.
Ajoutez-le comme postinstall.py et ajoutez-le à votre script de post-installation ou exécutez-le avec ./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()

Ici, vous pouvez ajouter vos propres scripts si nécessaire

On dirait une ré-implémentation de ce que vous obtenez avec npm install patch-package mais si python est votre truc et que vous voulez maintenir plus de code vous-même, cela semble viable. J'utilise toujours patch-package pour ce que ça vaut, avec 0.59.3 comme ça
react-native + 0.59.3.patch.txt

@hramos - # 19239 était similaire (je pense) et cela existe depuis longtemps mais semble avoir une solution. Est-ce que cela a juste besoin d'un PR pour un correctif ultime ou est-ce que je manque une raison pour laquelle le correctif utilisé ici n'est pas viable? (Je pourrais être). Si nous avons juste besoin d'un PR, je pourrais en envoyer un ...

On dirait une ré-implémentation de ce que vous obtenez avec npm install patch-package mais si python est votre truc et que vous voulez maintenir plus de code vous-même, cela semble viable. J'utilise toujours patch-package pour ce que ça vaut, avec 0.59.3 comme ça
react-native + 0.59.3.patch.txt

@hramos - # 19239 était similaire (je pense) et cela existe depuis longtemps mais semble avoir une solution. Est-ce que cela a juste besoin d'un PR pour un correctif ultime ou est-ce que je manque une raison pour laquelle le correctif utilisé ici n'est pas viable? (Je pourrais être). Si nous avons juste besoin d'un PR, je pourrais en envoyer un ...

Comment utiliser ce chemin, merci

@ZhanRu - https://github.com/ds300/patch-package#set -up - vous voulez juste mettre ce patch (avec l'extension .patch) dans le répertoire 'patches' de votre projet après l'installation et la configuration du patch- paquet

@ZhanRu - https://github.com/ds300/patch-package#set -up - vous voulez juste mettre ce patch (avec l'extension .patch) dans le répertoire 'patches' de votre projet après l'installation et la configuration du patch- paquet

Merci beaucoup

Pour tous ceux qui suivent encore, j'ai récemment intégré un système externe et j'ai dû séparer mes tests des données externes de production, ce qui conduit à utiliser des "saveurs" dans gradle afin que vous puissiez avoir qaDebug, stagingRelease, etc. Le patch ici ne supportait pas cela cependant, j'ai donc ajouté le support de saveur, et mon patch ressemble à ceci maintenant. Il vit dans patches/react-native+0.59.5.patch où il est appliqué pendant npm i exécute après 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)

Dans mon cas, le problème persiste avec le répertoire raw .

Version: react-native 0.59.5

Ma solution:

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

Cordialement

@Dbroqua votre solution a fonctionné pour moi (version react-native 0.59.5 ). Je vous remercie.

Très intéressant - je n'ai pas eu de problème avec raw - sachez que ma dernière version du patch a ajouté le support pour les saveurs. Si vous commencez à faire des saveurs, vous voudrez maintenant ce support de saveur dans ces deux fonctions. Peut-être que cela pourrait être paramétré d'une manière ou d'une autre pour que les 2 fonctions ne soient pas aussi répétitives mais je ne suis pas assez doué pour groovy pour le contempler.

Je peux seulement imaginer que ce n'est pas un problème dans Facebook et sur le CI natif de réaction, car ils utilisent BUCK et leur CI se construit à chaque fois. Quelqu'un a-t-il une reproduction propre de cela afin que nous puissions obtenir une solution en amont?

Dans mon cas, le répertoire raw contient du mp3 utilisé dans mon application.

Cela pourrait alors constituer la base d'une repro rapide et facile. Je n'ai pas d'actifs comme ça (encore) mais assez facile à réagir - init natif pour un repo, mettez des actifs puis je pense que sur la deuxième version (peut-être même la première?) Vous êtes arrosé ...

@Dbroqua juste un

D'accord,

Je ferai le nécessaire dès que possible.

Cordialement,
Damien

Fixé!

Dans mon cas, il y avait des fichiers dans les répertoires drawables res/drawable-* qui persistaient d'un autre développeur sur le commit de mes équipes - j'obtenais un "Error: Duplicate resources" pointant sur ces noms de fichiers - j'ai supprimé les fichiers des drawables et tout fonctionne bien 👍

La réponse de Mapsy devrait aider https://stackoverflow.com/a/52750886
Donc, fondamentalement, vous éditez le fichier /node_modules/react-native/react.gradle
et ajoutez le doLast juste après le bloc doFirst , manuellement.

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

ne fonctionne pas pour moi.

@ Nextt1 vous devrez ouvrir un nouveau numéro - avec un cas de test reproductible dans un dépôt public si possible - et peut-être proposer un nouveau PR. Ce problème a été résolu par mon PR, puis un autre (gérer un cas que mon premier PR n'a pas bien géré) a également été fusionné, nous avons donc tous évolué et je pense que cela fonctionne pour la plupart, donc ce problème ne se posera probablement pas. attention.

Salut tout le monde - le PR que j'ai proposé pour résoudre ce problème a été fusionné mais provoque apparemment une régression - https://github.com/facebook/react-native/issues/25325 - J'enquête mais s'il y a des gourous gradle ici que maintenant comment résoudre ce problème sans provoquer cette régression, une aide serait appréciée - merci!

D'accord, le PR associé ici va avoir un "PR de retour" - il provoque une régression, et le problème sous-jacent qui a causé ce problème était vraiment une mauvaise documentation.

Voici la chose: vous ne devriez jamais vraiment copier des choses dans le répertoire src pendant une construction. Vous devez copier des choses dans des intermédiaires et générés, etc. Si vous avez déjà copié des choses dans src (à partir de versions précédentes utilisant ce patch, ou à partir d'une commande de bundle react-native): vous devez les effacer pour que votre src / main / res le répertoire est propre - seuls les actifs réels de votre projet

Maintenant, pour créer un APK avec un bundle hors ligne - même en développement afin de pouvoir l'exécuter sur API <17, vous devez faire les choses différemment de ce que tout le monde sur le Web recommande (ou vous aurez ce problème).

Ce que vous voulez, c'est ceci dans votre 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
]

Ensuite, vous appelez react-native quelque chose comme ceci - en envoyant une propriété de projet gradle via une variable d'environnement:
ORG_GRADLE_PROJECT_bundleInDebug=true npx react-native run-android

(ou pour des variantes quelque chose comme ça ORG_GRADLE_PROJECT_bundleInDevDebug=true npx react-native run-android --variant devDebug )

Je voyais toujours cela, en utilisant macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. Peut-être que je ne suis pas le seul? Ou peut-être que quelqu'un ici peut confirmer que cela fonctionne alors je vais creuser plus et le réparer moi-même pour de vrai.

Je travaille actuellement autour de cela avec le package "patch-package" en combinaison avec le patch ci-joint basé sur le commentaire ci-dessus de @mkchx (avec le suffixe .txt ajouté pour que github accepte la pièce jointe) afin de pouvoir automatiquement corrigez-le sur 'npm install' après avoir ajouté postinstall: patch-package à mes scripts package.json.

Peut-être que cela est utile à quelqu'un ...
react-native + 0.57.8.patch.txt

Impressionnant! Pour l'instant, c'est la meilleure réponse!

Je vois toujours cela dans 0.59.9. La réponse de @mkchx a réglé le problème pour moi

@juliancorrea @scg C'est une solution sans issue. J'ai posté tous les détails de la solution actuellement recommandée quelques commentaires ci-dessus et je ne peux que recommander le nouveau style. Si vous utilisez mon ancien patch attaché basé sur la réponse @mkchx, cela fonctionnera pour vous, pour le moment, mais seulement sous certaines conditions - il échoue dans d'autres scénarios courants dont votre projet pourrait avoir besoin à l'avenir

@mikehardy OK - Je vais regarder votre solution maintenant.
Je pense que ce que je veux réellement, c'est que la version APK signée d'Android Studio ignore le bundle (comme je le fais manuellement via le terminal).
Je vais jeter un œil aux paramètres que vous avez fournis et voir s'ils aident.

J'ai toujours des problèmes avec ça ...
Je n'arrive pas à créer mon fichier APK de version. J'obtiens l'erreur suivante pour chaque fichier d'actif:

[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 : Erreur: ressources en double

J'ai supprimé les deux instances de dossiers drawable-mdpi mais la génération APK les remet et les erreurs.
J'exécute manuellement ce qui suit pour créer mon bundle:

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/

Dans mon classement d'application, j'ai:

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

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

Juste comme information supplémentaire - mon application se construit bien dans le débogage (via react-native run-android )
En ce moment , la seule façon que je peux obtenir ma libération APK à construire est via doLast fix PR ci - dessus est revenu.

Je pense que je pourrais avoir au moins la raison / la solution de mon problème.

Mon ancienne commande bundle (que j'utilise depuis RN 0.2.x?!) A poussé les actifs vers le dossier de destination android/app/src/main/res/

J'ai noté un message sur le lien ci-dessous qui indique que> RN 57 a réellement besoin d'actifs poussés dans le dossier suivant:
android/app/build/intermediates/res/merged/release/

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

J'ai fait ce qui suit:

  • supprimé les éléments drawable-mdpi qui avaient été copiés dans android/app/src/main/res/
  • a mis à jour ma commande bundle pour utiliser le nouvel emplacement du dossier
  • mon APK se construit maintenant ... (_ Je suis sur le point de le tester_)

mettre à jour
L'APK installé mais l'application plante maintenant à l'exception:
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'defaultSrc' of a view managed by: RCTImageView

... il semble donc qu'il ne trouve pas les images 😞

mise à jour 2
La seule façon dont j'ai pu faire fonctionner l'APK (jusqu'à présent) est de faire ce qui suit:

  • revenir à mon appel groupé pour utiliser les éléments suivants pour les éléments: android/app/src/main/res/
  • exécutez la commande bundle
  • renommer le android/app/src/main/res/drawable-mdpi en android/app/src/main/res/drawable-hdpi
  • créer l'APK signé

mon grade de construction est:

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

L'APK se construit et s'exécute ensuite ...

Note latérale:
J'ai eu un bug inattendu qui a entraîné une exception createBitmap OutOfMemory sur un composant de curseur d'image.
J'ai ajouté ce qui suit à mon manifeste et l'application s'exécute à nouveau: android:largeHeap="true"
Je suis conscient que l'ajout contourne ce qui pourrait être un problème de fuite / composant, mais jusqu'à présent, l'application fonctionne à nouveau sans problème.

Dans React Native 0.60.0, j'ai remarqué que la base native crée également des ressources en double, mais la solution de contournement ci-dessus ne fonctionnera pas car elle cible le dossier brut.

[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: Erreur: ressources en double

Pour les autres utilisateurs ayant ce problème:

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

comment pouvons-nous résoudre ce problème si nous utilisons CI?

Dans mon cas, le problème persiste avec le répertoire raw .

Version: react-native 0.59.5

Ma solution:

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

Cordialement

Cela marche!

[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

J'obtiens cette erreur lorsque j'exécute react-native run-android mais pas lorsque je construis et exécute la version de version. Aucune des solutions ci-dessus ne fonctionne pour moi.

RN 0,60,5

MISE À JOUR: J'ai réalisé que je devais modifier les méthodes "patch" ci-dessus pour citer les répertoires debug au lieu de release et cela a corrigé le problème. Moi aussi j'ai dû réparer mon répertoire raw

J'ai aussi le même problème et le patch react.gradle ne le résoudra pas. Dans mon cas, mes ressources dupliquées sont des fichiers .OBJ et .MTL, je n'ai aucun problème avec les ressources d'image.

[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 / DinerApp /android/app/src/main/res/raw/assets_res_salad_salad.obj: Erreur: ressources en double
[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: Erreur: ressources en double
[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_salmon] / Users / sercanov / Projects / ARtinerApp /android/app/src/main/res/raw/assets_res_salmon_salmon.obj: Erreur: ressources en double

@sercanov essayez -vous toujours d'utiliser la copie vers src? Ce style a été étudié et échoue pour des raisons connues, il existe des moyens de construction pris en charge qui ne placent pas les choses dans src - ou essayez-vous ces méthodes non-copier-vers-src et échouent toujours? https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

hey @mikehardy a en fait essayé les deux approches, aucune d'entre elles ne les a fait fonctionner dans les versions de version. Cela fonctionne bien en mode débogage btw.

Lors de l'utilisation de la méthode not-copy-to-src ORG_GRADLE_PROJECT_bundleInArRelease=true npx react-native run-android --variant arRelease j'obtiens celui-ci;

L'exécution a échoué pour la tâche «: 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_can_salad_saladov] / Users / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.obj: Erreur: ressources en double
[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: Erreur: ressources en double
[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_can_salmon_salmonov / Users / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.obj: Erreur: ressources en double

Lorsqu'il est utilisé de manière copie vers src doLast; Je devais effacer le dossier android / build à chaque fois que je construis pour réussir, mais les actifs n'étaient pas disponibles dans l'application. Cela peut être lié à mon code, en cours d'enquête à ce sujet.

Lorsque vous passez à la méthode de non-copie vers src, vous devez d'abord tout nettoyer, pour effectuer le changement. Mon projet avait beaucoup de "litière" du point de vue du regroupement du style précédent de copie vers src que je devais nettoyer avant de fonctionner, puis cela fonctionnait à chaque fois.

@ rahulkumar1409 cela m'a aidé dans cette erreur mais cela génère une autre erreur

Tâche: react-native-simple-download- manager: verifyReleaseResources FAILED

Avez-vous une idée de pourquoi cela se produit?

Cette solution a fonctionné pour moi.
Donc, fondamentalement, vous éditez le fichier /node_modules/react-native/react.gradle
et ajoutez le doLast juste après le bloc doFirst, manuellement.

faire en premier { ... }
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 (fichier: 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 ()
}

Nous sommes sur 0.60.5 natif de réaction.

Nous utilisons des saveurs de produits comme @mikehardy l'a mentionné et nous avons eu des problèmes avec le dossier «brut», tout comme @Dbroqua l'a connu.

J'ai fini par mélanger les deux solutions et nous utilisons ce 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()
}

Ce fil a été vraiment utile, merci à tous pour leur contribution. 😄

J'obtiens l'erreur en double uniquement sur les versions de version. J'utilise 60,5 natif de réaction

/release/drawable-xhdpi/node_modules_reactnavigationstack_lib_module_views_assets_backicon.png: Erreur: ressources en double

J'ai essayé de définir bundleInDebug sur true et false mais sans effet.

Je construis en utilisant App Center, cela nécessite un fichier src / main / assets / appcenter-config.json. J'ai également un répertoire src / main / assets / fonts car j'utilise des polices personnalisées. Est-ce que cela est susceptible de causer le problème?

@ARichIVC Je suppose que le problème est le fichier référencé dans votre message d'erreur.

Il ressemble au problème standard "mon répertoire src / est pollué par les tentatives précédentes de style copie pour gérer l'empaquetage de bundles" de cette solution originale avant que nous nous rendions tous compte que c'est une solution sans issue et que vous devez effacer src / de ceux copiés choses avant d'essayer la solution de suivi de faire les choses bundleInDebug. Tout est dans ce fil qui est malheureusement lourd et long, mais les informations sont là

Merci @mikehardy pour votre aide. J'ai trouvé que c'était bien de laisser les polices, etc. dans le répertoire des actifs, mais j'avais besoin de supprimer les autres éléments qui traînaient. À savoir tout ce qui se trouve dans \ android \ app \ src \ main \ res \ drawable-hdpi \

Notez que même pour les polices, elles doivent être dans le bon répertoire - un exemple: https://github.com/oblador/react-native-vector-icons#android qui vous demande d'appeler ce fichier qui copie soigneusement dans un non-src répertoire https://github.com/oblador/react-native-vector-icons/blob/master/fonts.gradle#L16 - le projet de chacun est bien sûr différent, mais j'ai pensé qu'il valait la peine d'être mentionné

Nous sommes sur 0.60.5 natif de réaction.

Nous utilisons des saveurs de produits comme @mikehardy l'a mentionné et nous avons eu des problèmes avec le dossier «brut», tout comme @Dbroqua l'a connu.

J'ai fini par mélanger les deux solutions et nous utilisons ce 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()
}

Ce fil a été vraiment utile, merci à tous pour leur contribution. 😄

Ça marche! Merci beaucoup! 👍

Pour react native 0.59.1 ou supérieur, vous devez ajouter le code ci-dessous dans react.gradle dans node_modules / react-native.

pour une utilisation aromatisée ci-dessous le 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 ce mauvais conseil. Cette solution de style a été poursuivie au point où elle avait un PR et a même été fusionnée. Ensuite, on a découvert que c'était la mauvaise direction et le PR a été inversé. Conseilleriez-vous aux gens d'utiliser une solution qui a entraîné l'annulation d'une fusion de relations publiques? Je ne voudrais pas. https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

@mikehardy Oui, je sais que ce n'est pas une solution permanente mais cela fonctionne très bien. Et je ne peux pas non plus utiliser votre solution car j'ai d'autres fichiers comme les écrans de démarrage et la base de données dans le répertoire res .

Oui @ dayachand-systematix moi aussi:

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

Et toujours la solution suggérée / non-PR-inversée fonctionne pour moi: man_shrugging:

Heya, nous l'avons corrigé en supprimant le paramètre --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 - la suppression du paramètre --asset-dest ne ferait pas en sorte que les derniers éléments ne soient pas regroupés au bon endroit ... donc lorsque vous créez votre APK, il y aurait un risque de manquer / de manquer date des fichiers d'actifs dans l'application?

@scgough j'ai pensé que c'était peut-être le cas. Si tel est le cas, nous pouvons supprimer de manière sélective tous les actifs en double, à l'exception des actifs locaux dont nous avons besoin avant de créer avec Android Studio ou tout autre flux de production, par exemple

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

Pas idéal mais cela devrait fonctionner jusqu'à ce que cela soit résolu.

Ce problème se produit lorsque si vous avez des fichiers du même nom et d'une extension différente dans le dossier des actifs comme celui-ci

back.png
back.jpg

parce que dans Android, les deux appellent comme ça;

R.drawable.back
R.drawable.back

supprimer ou renommer l'un des fichiers.

Salut,
J'ai essayé de modifier react.gradle: la construction va encore plus loin (l'app.aab est compilée mais je ne peux pas créer l'APK.

J'ai essayé de créer l'APK avec Android Studio et il n'y a pas eu de problème (avec le correctif pour react.gradle).
C'est assez étrange pour moi car le processus de création de l'APK devrait être le même dans les deux cas. Ai-je tort ?

Ce commentaire a fonctionné pour 0.59.10. Mélangé avec cette substance .

Merci beaucoup, @ dayachand-systematix!

Ce qui a fonctionné pour moi était une combinaison de deux commentaires:

Je colle ceci ici pour tous ceux qui pourraient en avoir besoin.

''
def flavourPathSegment = ""
android.productFlavors.all {saveur ->
if (targetName.toLowerCase (). contains (saveur.name)) {
flavourPathSegment = saveur.nom
}
}

        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

@AbhishekNairOfficial

node_modules / react-native / react.gradle.

Mettez ceci après le bloc doFirst ()

@AbhishekNairOfficial

node_modules / react-native / react.gradle.

Mettez ceci après le bloc doFirst ()

Je suppose que ce n'est pas la bonne façon de contourner ce problème. Parce que ce changement sera annulé lors du prochain npm install . Même, le CI ne fonctionnera pas

Quelqu'un a essayé les commandes ci-dessous?

cd android
./gradlew clean
cd ..

Ça a marché pour moi

Ce qui a fonctionné pour moi était une combinaison de deux commentaires:

Je colle ceci ici pour tous ceux qui pourraient en avoir besoin.

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 mec tu as sauvé ma journée <3

Ce qui a fonctionné pour moi était une combinaison de deux commentaires:
Je colle ceci ici pour tous ceux qui pourraient en avoir besoin.

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 mec tu as sauvé ma journée <3

Haha merci. Je continuais à venir à ce fil presque quotidiennement, alors j'ai décidé de rendre la vie plus facile pour les autres aussi.

La suppression du dossier android/app/build et la reconstruction ont fonctionné pour moi.

Ma solution:
Supprimez tous les fichiers dans / votre_projet / android / app / src / main / raw / res .
Ça marche pour moi!

Ce qui a fonctionné pour moi était une combinaison de deux commentaires:

Je colle ceci ici pour tous ceux qui pourraient en avoir besoin.

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

merci @AbhishekNairOfficial. cela m'a fait gagner beaucoup de temps.

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

Donc, cela fonctionne, mais vos images sont manquantes, donc si vous réassemblez votre application, essayez de construire, vous obtenez la même erreur. Quelqu'un a-t-il encore une solution légitime à ce problème?

Obtenir la même chose dans la v0.61.5 et comme le dit @ wincod75 , la suppression des dossiers bruts et dessinables n'est pas vraiment une solution car toutes les images sont supprimées.

Je comprends qu'ils sont recréés pour la version de version, mais ce serait bien s'ils fonctionnaient également lors de l'exécution de react-native run-android --variant = release, cela ne fonctionne que lorsqu'ils sont dans src / main, il semble que l'on ne peut pas construire .

Quelqu'un a-t-il pu résoudre la v0.61.5?

@ gudbrand3 J'ai finalement implémenté le correctif noté ci-dessus dans le fichier "node_modules / react-native / react.gradle," juste pour que je puisse obtenir une nouvelle version de l'appstore, mais c'est absurde d'avoir à faire, je ne sais pas pourquoi cela n'a pas pas encore corrigé ...

@ wincod75 entendre entendre! J'ai fini avec le même ... bla. Je ne comprends pas non plus pourquoi il n'est pas seulement inclus dans le package jusqu'à ce qu'une meilleure approche soit trouvée, car les gens finissent par le faire de toute façon manuellement. Maintenant, il doit être refait pour chaque suppression de node_modules et re npm install. #frustrant

Supprimer les dossiers dessinables ne fonctionnerait pas pour moi car j'avais des ressources dessinables que je devais conserver. Mon problème était avec duplicate resources pour tout dans le dossier android/app/src/main/res/raw et les fichiers commençant par nodemodules... dans le dossier android/app/src/main/res/drawable . Cela a résolu le problème pour moi:

Ajout à android/app/build.gradle :

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

Suppression de tout ce qui a commencé par node de android/app/src/main/drawable* :

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

Nettoyer le projet, NE PAS EXÉCUTER LA COMMANDE REACT NATIVE BUNDLE , puis reconstruire.

J'espère que cela aide quelqu'un!

Oh mec. Peut-être qu'un correctif officiel est en cours?

J'ai le même problème sur la v.0.61.4

dans mon cas
d'abord: j'ai placé le code suivant dans node_modules / react-native / react.gradle après '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()
}

deuxième: j'ai supprimé tout le contenu du dossier android / app / src / main / res / raw
peut être utile pour quelqu'un

Oh mec. Peut-être qu'un correctif officiel est en cours?

J'espère que oui, j'utilise RN 0.62.1 et

L'ajout du code doLast ou la suppression des dossiers drawables résout ce problème.

Je me demande quelle est la recommandation officielle?

Je vous remercie

Supprimer les dossiers dessinables ne fonctionnerait pas pour moi car j'avais des ressources dessinables que je devais conserver. Mon problème était avec duplicate resources pour tout dans le dossier android/app/src/main/res/raw et les fichiers commençant par nodemodules... dans le dossier android/app/src/main/res/drawable . Cela a résolu le problème pour moi:

Ajout à android/app/build.gradle :

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

Suppression de tout ce qui a commencé par node de android/app/src/main/drawable* :

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

Nettoyer le projet, NE PAS EXÉCUTER LA COMMANDE REACT NATIVE BUNDLE , puis reconstruire.

J'espère que cela aide quelqu'un!

La solution ci-dessus m'a aidé à trouver une réponse décente:

Étape 1:

Ajout à android/app/build.gradle :

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

Étape 2:

Exécutez la commande suivante pour supprimer tous les fichiers node_module.

rm -rf drawable*/node*

Étape 3:

Exécutez cette commande pour créer et APK.

./gradlew assembleRelease

Étape 4:

J'ai créé le script suivant à utiliser dans mon package.json

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

J'espère que cela t'aides!
Et merci à tous ceux qui ont apporté leurs solutions

Pour toute personne ayant le problème avec les ressources brutes non-image; Je l'ai résolu en renommant les fichiers avec le même nom mais une extension différente.

Mon cas

J'avais des fichiers object.obj et object.mtl . Même si les extensions sont différentes, cela a généré une erreur de ressources en double. Parce qu'Android les récupère par nom de fichier. Donc, renommer object.mtl en object_material.mtl avait finalement résolu pour moi.

Cela peut être le même cas pour les ressources image aussi, essayez de les renommer si vous avez des images avec des noms identiques.

Ce qui a fonctionné pour moi était une combinaison de deux commentaires:

Je colle ceci ici pour tous ceux qui pourraient en avoir besoin.

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()) travaille pour moi.
mon flavor.name ressemble à xxXX.

Tous ces trucs dolast ont été ajoutés dans les PR # 24518 et # 24778, puis supprimés à nouveau dans # 25363. Quelqu'un sait-il pourquoi il a été supprimé? Cela a été un problème de LONGTEMPS, et je pensais qu'ils l'avaient réglé.

Qu'à cela ne tienne, répond ici:
https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
et ici: https://github.com/facebook/react-native/issues/25325

Au cas où cela aiderait, voici quelques one-liners de mon script (pour le problème Android X également):

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

Et cette solution m'a aidé à créer une version de version: https://github.com/facebook/react-native/issues/26245#issuecomment -631382817

les étapes suivantes l'ont fait pour moi:

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

Je reçois la même erreur. Toute solution ?

quelqu'un peut-il s'il vous plaît partager le fichier de correctif pour react native 0.62.2

J'ai créé ce patch pour le React Native 0.63.2. Si vous avez des dossiers 'mipmap-' , vous pouvez changer la référence pour cela dans le fichier android / app / src / main / AndroidManifest.xml

Exécutez ceci à la racine du projet pour créer le fichier de correctif

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

puis appliquez le patch avec

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

Recommande également de faire

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

Copiez node_ modules/react-native/react.gradle dans android/app/react.gradle , puis modifiez android/app/build.gradle et 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()
+          }

Cela fonctionne pour moi en 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()
            }


Voici le fichier 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

Salut à tous! Quelqu'un pourrait-il faire un PR pour ces changements? La modification de node_modules n'est pas idéale.

Salut à tous,

J'utilise 0.63.2 natif de réaction. J'ai également rencontré ce problème et essayé de modifier react.gradle, supprimer les ressources / drawable et tout. Mais enfin exécuter la commande gradlew assembleRelease fonctionné pour moi.

Je n'ai pas exécuté la commande de bundle react-native. gradlew assembleRelease exécute le bundle react-native et construit l'apk lui-même.

Cela fonctionne pour moi en 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()
            }

Voici le fichier 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

Je vous remercie

Cette page vous a été utile?
0 / 5 - 0 notes