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
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
react-native init demo
assets
dans le dossier racine du projet.image
avec l'image PNG ci-dessus.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/
Generate Signed APK
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)
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:
drawable-mdpi
qui avaient été copiés dans android/app/src/main/res/
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:
android/app/src/main/res/
android/app/src/main/res/drawable-mdpi
en android/app/src/main/res/drawable-hdpi
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.
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 où
@AbhishekNairOfficial où
node_modules / react-native / react.gradle.
Mettez ceci après le bloc doFirst ()
@AbhishekNairOfficial où
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 dossierandroid/app/src/main/res/raw
et les fichiers commençant parnodemodules...
dans le dossierandroid/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
deandroid/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:
Ajout à android/app/build.gradle
:
...
project.ext.react = [
...
bundleInRelease : true,
resourcesDirRelease : "src/release/res",
...
]
...
Exécutez la commande suivante pour supprimer tous les fichiers node_module.
rm -rf drawable*/node*
Exécutez cette commande pour créer et APK.
./gradlew assembleRelease
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.
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
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.