React-native: [Android] Error: recursos duplicados

Creado en 10 nov. 2018  ·  103Comentarios  ·  Fuente: facebook/react-native

Medio ambiente

Reaccionar la información del entorno nativo:

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

Descripción

No puedo crear un apk de lanzamiento con la imagen PNG en Android. Pero puede crear un apk de lanzamiento cuando no hay una imagen PNG en él. Aquí está el error que recibo al generar la versión de lanzamiento

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

FAILURE: Build failed with an exception.

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

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

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

Demo reproducible

  1. Crear una aplicación - react-native init demo
  2. Cree una carpeta assets en la carpeta raíz del proyecto.
  3. Agregue una imagen PNG dentro de la carpeta de activos.
  4. Ahora implemente un componente image con la imagen PNG anterior.
  5. Ahora empaquételo usando el 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. Luego genere la versión apk usando Generate Signed APK
Bug Android

Comentario más útil

La respuesta de Mapsy debería ayudar https://stackoverflow.com/a/52750886
Entonces, básicamente, edita el archivo /node_modules/react-native/react.gradle
y agregue el doLast justo después del bloque doFirst , manualmente.

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

Todos 103 comentarios

verifique esto https://github.com/facebook/react-native/issues/19239#issuecomment -414564404

¿Necesita eliminar la imagen de la carpeta dibujable si hay alguna?

@ ZeroCool00, ¿ eso no afectará a las imágenes en Android?

La respuesta de Mapsy debería ayudar https://stackoverflow.com/a/52750886
Entonces, básicamente, edita el archivo /node_modules/react-native/react.gradle
y agregue el doLast justo después del bloque doFirst , manualmente.

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 Verifiqué con ambas respuestas, está funcionando. Muchas gracias chicos :)

Hola a todos, ¿cómo podremos hacer esto con el trabajo de Jenkins? Como lo hará npm install siempre, lo que anula este cambio en el archivo react.gradle. Podemos crear compilación en Android Studio para Android, pero no es posible en jenkins.

Hola @ vivek-walecha-657 No he probado esto, pero puedes probar este comando para crear paquetes sin conexión

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

@jeffreyrajanofficial Gracias por escribir, la solución que ha proporcionado nos ayudará si cambiamos el archivo react.gradle. Pero no quiero hacer el lanzamiento cambiando el archivo react.gradle cada vez que hago npm install en todas partes.

@jeffreyrajanofficial ¿Puede decirnos qué versión (la última inferior a esta o superior a esta) funciona bien, sin este problema? Porque las notas de la versión no dicen nada de que este problema está resuelto.

Las cosas están ordenadas ahora en RN> 57 El archivo react.gradle crea automáticamente el paquete.
para crear una compilación de lanzamiento, no es necesario ejecutar npm run build: android : release

El uso de la versión nativa de 55.4 react aquí es mi proyecto de muestra para build.gradle package.json con correcciones.

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

Seguía viendo esto, usando macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. ¿Quizás no soy el único? O tal vez alguien aquí pueda confirmar que funciona, así que investigaré más y lo arreglaré yo mismo de verdad.

Actualmente estoy trabajando con el paquete "patch-package" en combinación con el parche adjunto basado en el comentario anterior de @mkchx (con el sufijo .txt agregado para que github acepte el archivo adjunto) para poder automatizar arréglelo en 'npm install' después de agregar postinstall: patch-package a mis scripts package.json.

Quizás esto sea útil para alguien ...
react-native + 0.57.8.patch.txt

Elimina los archivos que puedas tener en:

android / app / src / main / res / drawable-mdpi /
android / app / src / main / res / drawable-xhdpi /
android / app / src / main / res / drawable-xxhdpi /
Ejecute Build de nuevo, esto solucionó el problema para mí.

Seguía viendo esto en RN0.58.xy continúa en RN0.59.x: ¿estamos haciendo algo mal aquí o es realmente un error?

Sigo teniendo éxito con la solución alternativa de @mkchx codificada en forma de parche en el directorio de parches para usar con el módulo de paquete de parche y este parche (actualizado para RN0.59.1)

react-native + 0.59.1.patch.txt

Si tiene recursos adicionales agregados en carpetas personalizadas, es posible que desee probar algo como esto:

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

Pero si tiene dependencias que están empaquetando sus propios activos, no está funcionando, todavía recibe este error (editado para mayor claridad):

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

¿Esto se evalúa activamente o deberíamos seguir adelante con nuestros propios parches?

@dragosroua Veo un guión que falta en tu curry xxxhdpi. ¿Casualmente los mismos caminos principales con problemas para usted?

Me ganaste por 2 minutos, estaba a punto de editar esa parte. Sí, todo está bien ahora, pero el bit con la ruta "sin procesar" para los recursos personalizados puede ser útil para alguien.

@dragosroua me alegro de que estés compilando ahora. Recuerdo lo frustrante que fue para mí, y todavía me sorprende que no esté arreglado en el maestro, aunque tampoco he propuesto un PR, así que supongo que saco lo que puse. ..

Seguía viendo esto, usando macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. ¿Quizás no soy el único? O tal vez alguien aquí pueda confirmar que funciona, así que investigaré más y lo arreglaré yo mismo de verdad.

Actualmente estoy trabajando con el paquete "patch-package" en combinación con el parche adjunto basado en el comentario anterior de @mkchx (con el sufijo .txt agregado para que github acepte el archivo adjunto) para poder automatizar arréglelo en 'npm install' después de agregar postinstall: patch-package a mis scripts package.json.

Quizás esto sea útil para alguien ...
react-native + 0.57.8.patch.txt

Por favor, explíqueme por qué mi react-native 0.57.5 no funciona.
Creé el archivo pacth. Agregado a package.json. Ejecute npm install y tiene como resultado

        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

sin cambios necesarios.

@zakabluk , necesitaría publicar el resultado de su instalación de npm, pero supongo que es porque el paquete patch-package es muy cuidadoso con los números de versión. está probando 57.5, pero el parche es contra 57.8?

Por lo general, hago scripts de Python para parchear node_modules.
Agregue esto como postinstall.py y agréguelo a su script postinstall o ejecútelo con ./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()

Aquí puede agregar sus propios scripts si es necesario

Parece una reimplementación de lo que obtienes con npm install patch-package pero si lo tuyo es python y quieres mantener más código, parece viable. Todavía estoy usando el paquete de parches por lo que vale, con 0.59.3 así
react-native + 0.59.3.patch.txt

@hramos - # 19239 fue similar (creo) y esto es de larga data pero parece tener una solución. ¿Esto solo necesita un PR para una solución definitiva o me falta una razón por la que el parche utilizado aquí no es viable? (Podría ser). Si solo necesitamos un PR, podría enviar uno ...

Parece una reimplementación de lo que obtienes con npm install patch-package pero si lo tuyo es python y quieres mantener más código, parece viable. Todavía estoy usando el paquete de parches por lo que vale, con 0.59.3 así
react-native + 0.59.3.patch.txt

@hramos - # 19239 fue similar (creo) y esto es de larga data pero parece tener una solución. ¿Esto solo necesita un PR para una solución definitiva o me falta una razón por la que el parche utilizado aquí no es viable? (Podría ser). Si solo necesitamos un PR, podría enviar uno ...

Cómo usar este camino, gracias

@ZhanRu - https://github.com/ds300/patch-package#set -up - solo desea poner ese parche (con la extensión .patch) en el directorio 'parches' en su proyecto después de instalar y configurar el parche- paquete

@ZhanRu - https://github.com/ds300/patch-package#set -up - solo desea poner ese parche (con la extensión .patch) en el directorio 'parches' en su proyecto después de instalar y configurar el parche- paquete

Muchas gracias

Para cualquiera que todavía esté siguiendo, recientemente integré un sistema externo y necesitaba separar mis pruebas de los datos externos de producción, lo que lleva a usar "sabores" en gradle para que pueda tener qaDebug, stagingRelease, etc., etc. apuntando a un sistema externo diferente. Sin embargo, el parche aquí no admitía eso, así que agregué soporte de sabor y mi parche se ve así ahora. Vive en patches/react-native+0.59.5.patch donde se aplica durante npm i ejecuta después de 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)

En mi caso, el problema persiste con el directorio raw .

Versión: react-native 0.59.5

Mi solución:

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

Saludos

@Dbroqua, su solución funcionó para mí (versión react-native 0.59.5 ). Gracias.

Muy interesante, no he tenido ningún problema con raw, ten en cuenta que mi última versión del parche agregó soporte para sabores. Si comienza a hacer sabores, querrá ese soporte de sabor ahora en ambas funciones. Tal vez podría parametrizarse de alguna manera para que las 2 funciones no sean tan repetitivas, pero no soy lo suficientemente bueno como para contemplarlo.

Solo puedo imaginar que esto no es un problema en Facebook y en el CI nativo de reacción porque están usando BUCK y su CI se construye de forma limpia cada vez. ¿Alguien tiene una reproducción limpia de esto para que podamos solucionarlo?

En mi caso, el directorio sin formato contiene algunos mp3 utilizados en mi aplicación.

Entonces, eso podría formar la base de una reproducción rápida y fácil. No tengo activos como ese (todavía) pero lo suficientemente fácil como para reaccionar: init nativo para un repositorio, coloque algunos activos y luego creo que en la segunda versión de lanzamiento (¿tal vez incluso la primera?)

@Dbroqua es un formato están muy relacionados pero no incluidos en mi parche también se refleja en la fusión. Ahora que mi parche está instalado, es posible que desee ver qué cambio se requiere para el directorio sin formato y proponer un PR con una continuación de la corrección, extendiéndolo para su caso.

Okay,

Haré lo necesario lo antes posible.

Saludos,
Damien

¡Fijo!

En mi caso, había archivos en los directorios de drawables res/drawable-* que quedaban de algún otro desarrollador en el compromiso de mi equipo. Recibía un "Error: recursos duplicados" que apuntaban a esos nombres de archivo. Eliminé los archivos de los drawables. y todo funciona bien 👍

La respuesta de Mapsy debería ayudar https://stackoverflow.com/a/52750886
Entonces, básicamente, edita el archivo /node_modules/react-native/react.gradle
y agregue el doLast justo después del bloque doFirst , manualmente.

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

no funciona para mí.

@ Nextt1 tendrá que abrir un nuevo problema, con un caso de prueba reproducible en un repositorio público si es posible, y tal vez proponer un nuevo PR. Este problema fue cerrado por mi RP y luego uno adicional (manejo de un caso que mi primer RP no manejó bien) también se fusionó, por lo que todos hemos avanzado y creo que está funcionando para la mayoría, por lo que es probable que este problema no llegue atención.

Hola a todos, el PR que propuse para solucionar esto se fusionó pero aparentemente causa una regresión - https://github.com/facebook/react-native/issues/25325 - Estoy investigando, pero si hay algún gurú de Gradle aquí que ahora cómo solucionar este problema sin causar esa regresión, se agradecería la ayuda, ¡gracias!

Bien, el PR relacionado aquí va a tener un "PR reversible" - causa una regresión, y el problema subyacente que causó este problema fue realmente una mala documentación.

Aquí está la cuestión: nunca debes copiar cosas en el directorio src durante una compilación. Necesita copiar cosas en intermedios y generadas, etc. Si ya ha copiado cosas en src (de compilaciones anteriores usando este parche, o desde un comando de paquete react-native): debe borrarlas para que su src / main / res el directorio está limpio: solo activos reales de su proyecto

Ahora, para crear un APK con un paquete fuera de línea, incluso en desarrollo para poder ejecutarlo en API <17, debe hacer las cosas de manera diferente a lo que recomiendan todos en la web (o tendrá este problema).

Lo que quieres es esto en tu 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
]

Luego llama a react-native algo como esto: enviando una propiedad de proyecto gradle a través de una variable de entorno:
ORG_GRADLE_PROJECT_bundleInDebug=true npx react-native run-android

(o para variantes como esta ORG_GRADLE_PROJECT_bundleInDevDebug=true npx react-native run-android --variant devDebug )

Seguía viendo esto, usando macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. ¿Quizás no soy el único? O tal vez alguien aquí pueda confirmar que funciona, así que investigaré más y lo arreglaré yo mismo de verdad.

Actualmente estoy trabajando con el paquete "patch-package" en combinación con el parche adjunto basado en el comentario anterior de @mkchx (con el sufijo .txt agregado para que github acepte el archivo adjunto) para poder automatizar arréglelo en 'npm install' después de agregar postinstall: patch-package a mis scripts package.json.

Quizás esto sea útil para alguien ...
react-native + 0.57.8.patch.txt

¡Increíble! ¡Por ahora, es la mejor respuesta!

Sigo viendo esto en 0.59.9. La respuesta de @mkchx solucionó el problema por mí

@juliancorrea @scgough solo ten cuidado con eso, seguí ese estilo de solución hasta el final con un PR aceptado incluso, pero después de los problemas de seguimiento, tuvimos que revertirlo. Es una solución sin salida. Publiqué los detalles completos de la solución actualmente recomendada en un par de comentarios arriba y solo puedo recomendar el nuevo estilo. Si usa mi antiguo parche adjunto basado en la respuesta de @mkchx , funcionará para usted, por ahora, pero solo bajo ciertas condiciones; falla en otros escenarios comunes que su proyecto puede necesitar en el futuro

@mikehardy OK, ahora analizaré tu solución.
Creo que lo que realmente quiero es que la compilación de APK firmada de Android Studio omita el paquete (ya que lo hago manualmente a través de la terminal).
Voy a echar un vistazo a la configuración que ha proporcionado y veré si ayudan.

Todavía tengo problemas con esto ...
Parece que no puedo crear mi archivo APK de lanzamiento. Recibo el siguiente error para cada archivo de activos:

[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 : Error: recursos duplicados

He eliminado ambas instancias de las carpetas drawable-mdpi pero la generación de APK las coloca de nuevo y los errores.
Estoy ejecutando lo siguiente manualmente para crear mi paquete:

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/

En mi aplicación gradle tengo:

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

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

Solo como información adicional: mi aplicación se compila bien en la depuración (a través de react-native run-android )
Por el momento, la única forma en que puedo obtener mi versión APK para compilar es a través de la corrección de relaciones públicas revertida doLast anterior.

Creo que al menos podría tener la razón / solución para mi problema.

Mi antiguo comando de paquete (lo he usado desde RN 0.2.x?!) Empujó los activos a la carpeta de destino android/app/src/main/res/

Noté una publicación en el enlace a continuación que indica que> RN 57 realmente necesita activos enviados a la siguiente carpeta:
android/app/build/intermediates/res/merged/release/

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

Hice lo siguiente:

  • eliminó los drawable-mdpi activos que se habían copiado en android/app/src/main/res/
  • actualicé mi comando de paquete para usar la nueva ubicación de la carpeta
  • mi APK ahora se compila ... (_ Estoy a punto de probarlo_)

actualizar
El APK se instaló, pero la aplicación se bloquea ahora con la excepción:
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'defaultSrc' of a view managed by: RCTImageView

... entonces parece que no puede encontrar las imágenes 😞

actualización 2
La única forma en que he podido hacer que el APK funcione (hasta ahora) es hacer lo siguiente:

  • revertir mi llamada de paquete para usar lo siguiente para los activos: android/app/src/main/res/
  • ejecutar el comando bundle
  • cambiar el nombre de android/app/src/main/res/drawable-mdpi a android/app/src/main/res/drawable-hdpi
  • compila el APK firmado

mi build gradle es:

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

Luego, el APK se compila y se ejecuta ...

Nota al margen:
Obtuve un error inesperado que resultó en una excepción createBitmap OutOfMemory en un componente deslizante de imagen.
Agregué lo siguiente a mi manifiesto y la aplicación se ejecuta nuevamente: android:largeHeap="true"
Soy consciente de que la adición evita lo que podría ser un problema de fuga / componente, pero hasta ahora la aplicación se ejecuta sin problemas nuevamente.

En React Native 0.60.0, noté que la base nativa también está creando recursos duplicados, pero la solución anterior no funcionará porque se dirige a la carpeta sin formato.

[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 \ generate \ res \ reactreleaserawnode_modules_nativebase_dist_src_basic_icon_nbicons.json: Error: recursos duplicados

Para otros usuarios que tengan este problema:

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

¿Cómo podemos resolver esto si usamos CI?

En mi caso, el problema persiste con el directorio raw .

Versión: react-native 0.59.5

Mi solución:

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

Saludos

¡Esto funciona!

[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

Recibo este error cuando ejecuto react-native run-android pero no cuando construyo y ejecuto la versión de lanzamiento. Ninguna de las soluciones anteriores me funciona.

RN 0,60,5

ACTUALIZACIÓN: Me di cuenta de que debería modificar los métodos de "parche" anteriores para citar los directorios debug lugar de release y eso lo solucionó. Yo también tuve que arreglar mi directorio raw

También tengo el mismo problema y el parche react.gradle no lo solucionará. En mi caso, mis recursos duplicados son archivos .OBJ y .MTL, no tengo ningún problema con los recursos de imagen.

[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_salad] / Users / sercanov / Projects / ARt / diner / /android/app/src/main/res/raw/assets_res_salad_salad.obj: Error: recursos duplicados
[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 / /android/app/src/main/res/raw/assets_res_steak_steak.obj: Error: recursos duplicados
[raw / assets_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_salmon_salmon.mtl [raw / assets_res_salmon_salmon] / Users / sercanov / Projects / ARt / diner / /android/app/src/main/res/raw/assets_res_salmon_salmon.obj: Error: recursos duplicados

@sercanov , ¿sigues intentando usar la copia en src? Ese estilo fue investigado y falla por razones conocidas, hay formas admitidas de compilación que no colocan las cosas en src, ¿o estás intentando esas formas de no copiar a src y aún fallas? https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

hey @mikehardy en realidad probó ambos enfoques, ninguno de ellos lo hizo funcionar en versiones de lanzamiento. Funciona bien en modo de depuración por cierto.

Cuando utilizo la forma not-copy-to-src ORG_GRADLE_PROJECT_bundleInArRelease=true npx react-native run-android --variant arRelease obtengo este;

Error en la ejecución de la tarea ':
[raw / assets_res_salad_salad] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.mtl [raw / assets_res_salad_salad] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.obj: Error: recursos duplicados
[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: Error: recursos duplicados
[raw / assets_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.mtl [raw / assets_res_salmon_salmon] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.obj: Error: recursos duplicados

Cuando se usa copy-to-src doLast way; Tuve que borrar la carpeta android / build cada vez que construyo para que tuviera éxito, pero de alguna manera los activos no estaban disponibles en la aplicación. Esto puede estar relacionado con mi código, actualmente investigando al respecto.

Al cambiar a la forma de no copiar a src, primero debe limpiar todo, para hacer el cambio. Mi proyecto tenía mucha "basura" desde la perspectiva de la agrupación del estilo anterior de copia a src que tuve que limpiar antes de que funcionara, luego funcionó siempre.

@ rahulkumar1409 esto me ayudó en este error pero arroja otro error

Tarea: react-native-simple-download- manager: verifyReleaseResources FAILED

¿Tienes idea de por qué sucede esto?

Esta solución funcionó para mí.
Entonces, básicamente, edita el archivo /node_modules/react-native/react.gradle
y agregue el doLast justo después del bloque doFirst, manualmente.

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

Estamos en react-native 0.60.5.

Estamos usando sabores de productos como lo mencionó lo experimentó

Terminé mezclando ambas soluciones y usamos este código:

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

Este hilo ha sido realmente útil, gracias a todos por contribuir. 😄

Recibo el error duplicado solo en versiones de lanzamiento. Estoy usando react-native 60.5

/release/drawable-xhdpi/node_modules_reactnavigationstack_lib_module_views_assets_backicon.png: Error: recursos duplicados

Intenté configurar bundleInDebug en verdadero y falso pero sin ningún efecto.

Estoy construyendo usando el centro de aplicaciones, esto requiere un archivo src / main / assets / appcenter-config.json. También tengo un directorio src / main / assets / fonts ya que estoy usando fuentes personalizadas. ¿Es probable que esto sea la causa del problema?

@ARichIVC Supongo que el problema es el archivo al que se hace referencia en su mensaje de error.

Parece que el problema estándar "mi directorio src / está contaminado por intentos anteriores de estilo de copia para manejar el empaquetado del paquete" de esta solución original antes de que todos nos diéramos cuenta de que es una solución sin salida y que necesita borrar src / de los copiados cosas antes de probar la solución de seguimiento de hacer las cosas bundleInDebug. Todo está en este hilo que desafortunadamente es difícil de manejar y largo, pero la información está ahí

Gracias @mikehardy por tu ayuda. Descubrí que estaba bien dejar las fuentes, etc.en el directorio de activos, pero necesitaba eliminar los otros bits y piezas que estaban por ahí. Es decir, todo en \ android \ app \ src \ main \ res \ drawable-hdpi \

Tenga en cuenta que incluso para las fuentes, deben estar en el directorio correcto, un ejemplo: https://github.com/oblador/react-native-vector-icons#android que le indica que llame a este archivo que se copia cuidadosamente en un no src directorio https://github.com/oblador/react-native-vector-icons/blob/master/fonts.gradle#L16 - el proyecto de todos es diferente, por supuesto, pero pensé que valía la pena mencionarlo

Estamos en react-native 0.60.5.

Estamos usando sabores de productos como lo mencionó lo experimentó

Terminé mezclando ambas soluciones y usamos este código:

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

Este hilo ha sido realmente útil, gracias a todos por contribuir. 😄

¡funciona! ¡muchas gracias! 👍

Para react native 0.59.1 o superior, debe agregar el siguiente código en react.gradle en node_modules / react-native.

para uso aromatizado debajo del código.

        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 este mal consejo. Esa solución de estilo se persiguió hasta el punto en que tuvo un PR y se fusionó incluso. Luego se descubrió que era la dirección equivocada y se revirtió el PR. ¿Aconsejaría a las personas que usen una solución que realmente provoque la reversión de una fusión de relaciones públicas? Yo no lo haría. https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

@mikehardy Sí, sé que esta no es una solución permanente, pero está funcionando bien. Y tampoco puedo usar su solución porque tengo algunos otros archivos como pantallas de presentación y DB en el directorio res .

Sí @ dayachand-systematix yo también:

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

Y aún así, la solución sugerida / no revertida de PR funciona para mí: man_shrugging:

Oye, lo arreglamos eliminando el parámetro --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: no eliminar el parámetro --asset-dest provocaría que los activos más recientes no se empaqueten en el lugar correcto ... por lo que cuando crea su APK, existe el peligro de perder fecha archivos de activos en la aplicación?

@scgough pensé que ese podría ser el caso. Si es así, podemos eliminar selectivamente todos los activos duplicados excepto los activos locales que necesitamos antes de construir con Android Studio o cualquier flujo de trabajo de producción, por ejemplo

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

No es ideal, pero debería funcionar hasta que se resuelva.

Este problema se produce cuando tiene archivos con el mismo nombre y extensión diferente en la carpeta de activos como esa

back.png
back.jpg

porque en android ambos llaman así;

R.drawable.back
R.drawable.back

eliminar o cambiar el nombre de uno de los archivos.

Hola,
Intenté modificar react.gradle: la compilación va un paso más allá (la app.aab está compilada pero no puedo compilar el APK.

Intenté compilar el APK con Android Studio y no hubo ningún problema (con el parche para react.gradle).
Es bastante extraño para mí porque el proceso para construir el APK debería ser el mismo en ambos casos. Me equivoco ?

Este comentario funcionó para 0.59.10. Mezclado con esta esencia .

¡Muchas gracias, @ dayachand-systematix!

Lo que funcionó para mí fue una combinación de dos comentarios:

Estoy pegando esto aquí para cualquier otra persona que pueda necesitarlo.

''
def flavourPathSegment = ""
android.productFlavors.all {sabor ->
if (targetName.toLowerCase (). contiene (sabor.nombre)) {
FlavorPathSegment = sabor.nombre
}
}

        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 ¿dónde pones esto?

@AbhishekNairOfficial ¿dónde pones esto?

node_modules / react-native / react.gradle.

Pon esto después del bloque doFirst ()

@AbhishekNairOfficial ¿dónde pones esto?

node_modules / react-native / react.gradle.

Pon esto después del bloque doFirst ()

Supongo que no es la forma correcta de solucionar este problema. Porque este cambio se anulará en el próximo npm install . Incluso, el CI no funcionará

¿Alguien probó los siguientes comandos?

cd android
./gradlew clean
cd ..

Funcionó para mi

Lo que funcionó para mí fue una combinación de dos comentarios:

Estoy pegando esto aquí para cualquier otra persona que pueda necesitarlo.

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 hombre, salvaste mi día <3

Lo que funcionó para mí fue una combinación de dos comentarios:
Estoy pegando esto aquí para cualquier otra persona que pueda necesitarlo.

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 hombre, salvaste mi día <3

Jaja gracias. Seguí viniendo a este hilo casi a diario, así que decidí hacer la vida más fácil para los demás también.

Eliminar la carpeta android/app/build y volver a construir funcionó para mí.

Mi solución:
Elimina todos los archivos en / your_project / android / app / src / main / raw / res .
¡Es un trabajo para mí!

Lo que funcionó para mí fue una combinación de dos comentarios:

Estoy pegando esto aquí para cualquier otra persona que pueda necesitarlo.

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

gracias @AbhishekNairOfficial. me ahorró mucho tiempo.

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

Entonces, esto funciona, pero faltan sus imágenes, por lo que si vuelve a agrupar su aplicación y luego intenta compilar, obtendrá el mismo error. ¿Alguien tiene una solución legítima para esto todavía?

Obtener lo mismo en v0.61.5 y como dice @ wincod75 , eliminar carpetas sin formato y

Entiendo que se recrean para la compilación de lanzamiento, pero sería bueno si también funcionaran cuando se ejecuta react-native run-android --variant = release, eso solo funciona cuando están en src / main, se ve y luego uno no puede compilar .

¿Alguien ha podido resolver en v0.61.5?

@ gudbrand3 Finalmente implementé la solución mencionada anteriormente en el archivo "node_modules / react-native / react.gradle", solo para poder obtener una nueva compilación para la tienda de aplicaciones, pero es absurdo tener que hacerlo, no estoy seguro de por qué esto no todavía no se ha solucionado ...

@ wincod75 escuchar, escuchar! Terminé con lo mismo .. bla. Tampoco entiendo por qué no se incluye en el paquete hasta que se encuentra un enfoque mejor, ya que la gente termina haciéndolo de todos modos manualmente. Ahora debe rehacerse para cada eliminación de node_modules y re npm install. #frustrante

Eliminar las carpetas dibujables no funcionaría para mí ya que tenía recursos dibujables que necesitaba conservar. Mi problema fue con duplicate resources para todo en la carpeta android/app/src/main/res/raw y los archivos que comenzaban con nodemodules... en la carpeta android/app/src/main/res/drawable . Esto resolvió mi problema:

Agregando a android/app/build.gradle :

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

Eliminando todo lo que comenzó con node de android/app/src/main/drawable* :

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

Limpiar el proyecto, NO EJECUTAR EL COMANDO REACCIONAR EL PAQUETE NATIVO , luego reconstruir.

¡Espero que esto ayude a alguien!

Oh chico. ¿Quizás una solución oficial está en camino?

Tengo el mismo problema en la v.0.61.4

en mi caso
primero: coloqué el siguiente código en node_modules / react-native / react.gradle después de '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()
}

segundo: eliminé todo el contenido de la carpeta android / app / src / main / res / raw
puede ser útil para alguien

Oh chico. ¿Quizás una solución oficial está en camino?

Eso espero, estoy usando RN

Agregar el código doLast o eliminar las carpetas de elementos de diseño resuelve este problema.

Me pregunto cuál es la recomendación oficial.

Gracias

Eliminar las carpetas dibujables no funcionaría para mí ya que tenía recursos dibujables que necesitaba conservar. Mi problema fue con duplicate resources para todo en la carpeta android/app/src/main/res/raw y los archivos que comenzaban con nodemodules... en la carpeta android/app/src/main/res/drawable . Esto resolvió mi problema:

Agregando a android/app/build.gradle :

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

Eliminando todo lo que comenzó con node de android/app/src/main/drawable* :

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

Limpiar el proyecto, NO EJECUTAR EL COMANDO REACCIONAR EL PAQUETE NATIVO , luego reconstruir.

¡Espero que esto ayude a alguien!

La solución anterior me ayudó a encontrar una respuesta decente:

Paso 1:

Agregando a android/app/build.gradle :

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

Paso 2:

Ejecute el siguiente comando para eliminar todos los archivos node_module.

rm -rf drawable*/node*

Paso 3:

Ejecute este comando para compilar y APK.

./gradlew assembleRelease

Etapa 4:

Hice el siguiente script para usar en mi package.json

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

¡Espero que esto ayude!
Y gracias a todos los que colaboraron con sus soluciones.

Para cualquier persona que tenga el problema de los recursos en bruto que no son imágenes; Lo resolví cambiando el nombre de los archivos con el mismo nombre pero con diferente extensión.

Mi caso

Tenía archivos object.obj y object.mtl . Incluso si las extensiones son diferentes, arrojó un error de recursos duplicados. Porque Android los recoge por nombre de archivo. Entonces, cambiar el nombre de object.mtl a object_material.mtl finalmente lo resolvió para mí.

También puede ser el mismo caso para los recursos de imagen, intente cambiarles el nombre si tiene imágenes con nombres idénticos.

Lo que funcionó para mí fue una combinación de dos comentarios:

Estoy pegando esto aquí para cualquier otra persona que pueda necesitarlo.

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()) trabaja para mí.
mi flavor.name parece xxXX.

Todo ese material dolast se agregó en PR # 24518 y # 24778, luego se eliminó nuevamente en # 25363. ¿Alguien sabe por qué se eliminó? Este ha sido un problema desde hace mucho tiempo y pensé que lo habían solucionado.

No importa, las respuestas aquí:
https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
y aquí: https://github.com/facebook/react-native/issues/25325

En caso de que eso ayude, aquí hay un par de frases breves de mi script (también para el problema de Android X):

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

npm install jetifier
npx jetify

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

cd .../node_modules/react-native

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

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

Y esta solución me ayudó a crear una versión de lanzamiento: https://github.com/facebook/react-native/issues/26245#issuecomment -631382817

los siguientes pasos lo hicieron por mí:

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

Estoy teniendo el mismo error. Alguna solución ?

¿Alguien puede compartir el archivo de parche para reaccionar nativo 0.62.2?

Creé este parche para React Native 0.63.2. Si usted tiene 'drawable-' carpetas, cambiar el nombre de 'mipmap-', puede cambiar la referencia para que en el androide / app / src / main / AndroidManifest.xml

Ejecute esto en la raíz del proyecto para crear el archivo de parche

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

luego aplique el parche con

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

También recomiendo hacer

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

Copie node_ modules/react-native/react.gradle a android/app/react.gradle , luego modifique android/app/build.gradle y 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()
+          }

Esto me funciona 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()
            }


Aquí el archivo de parche 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

¡Hola a todos! ¿Alguien podría hacer un PR para estos cambios? Editar node_modules no es ideal.

Hola a todos,

Estoy usando react-native 0.63.2. También enfrenté este problema e intenté editar react.gradle, eliminé recursos / dibujables y todo. Pero al final, ejecutar el comando gradlew assembleRelease funcionó para mí.

No ejecuté el comando react-native bundle. gradlew assembleRelease está ejecutando el paquete react-native y construyendo la propia apk.

Esto me funciona 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()
            }

Aquí el archivo de parche 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

gracias

¿Fue útil esta página
0 / 5 - 0 calificaciones