Saltar al contenido

React Native: Error: recursos duplicados – Android

Posterior a observar en diversos repositorios y sitios de internet al final hemos dado con la solución que te compartimos pronto.

Solución:

Después de probar muchas soluciones, encontré que solo dos soluciones funcionan. Aquí están

Solución 1:

Después de empaquetar, elimine el drawable carpeta de Android Studio. Podrías encontrar esto en android/app/src/main/res/drawable

Solucion 2:

POR FAVOR NO USE LA SOLUCIÓN # 2, SEGÚN LA PROPUESTA DEL AUTOR ORIGINAL. Todos los paquetes debajo node_modules se generan, y cualquier cambio que realice se perderá cuando el react-native el paquete se reinstala / actualiza.

En esta solución, no es necesario eliminar ninguna carpeta dibujable. Simplemente agregue el siguiente código en el reaccionar gradle archivo que puedes encontrar debajo node_modules/react-native/react.gradle sendero

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

Como referencia, agregaré el reaccionar gradle código de archivo aquí

import org.apache.tools.ant.taskdefs.condition.Os

def config = project.hasProperty("react") ? project.react : [];

def cliPath = config.cliPath ?: "node_modules/react-native/local-cli/cli.js"
def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
def entryFile = config.entryFile ?: "index.android.js"
def bundleCommand = config.bundleCommand ?: "bundle"
def reactRoot = file(config.root ?: "../../")
def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
def bundleConfig = config.bundleConfig ? "$reactRoot/$config.bundleConfig" : null ;


afterEvaluate 
    android.applicationVariants.all  def variant ->
        // Create variant and target names
        def targetName = variant.name.capitalize()
        def targetPath = variant.dirName

        // React js bundle directories
        def jsBundleDir = file("$buildDir/generated/assets/react/$targetPath")
        def resourcesDir = file("$buildDir/generated/res/react/$targetPath")

        def jsBundleFile = file("$jsBundleDir/$bundleAssetName")

        // Additional node and packager commandline arguments
        def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
        def extraPackagerArgs = config.extraPackagerArgs ?: []

        def currentBundleTask = tasks.create(
            name: "bundle$targetNameJsAndAssets",
            type: Exec) 

        // Expose a minimal interface on the application variant and the task itself:
        variant.ext.bundleJsAndAssets = currentBundleTask
        currentBundleTask.ext.generatedResFolders = files(resourcesDir).builtBy(currentBundleTask)
        currentBundleTask.ext.generatedAssetsFolders = files(jsBundleDir).builtBy(currentBundleTask)

        // registerGeneratedResFolders for Android plugin 3.x
        if (variant.respondsTo("registerGeneratedResFolders")) 
            variant.registerGeneratedResFolders(currentBundleTask.generatedResFolders)
         else 
            variant.registerResGeneratingTask(currentBundleTask)
        
        variant.mergeResources.dependsOn(currentBundleTask)

        // packageApplication for Android plugin 3.x
        def packageTask = variant.hasProperty("packageApplication")
            ? variant.packageApplication
            : tasks.findByName("package$targetName")

        def resourcesDirConfigValue = config."resourcesDir$targetName"
        if (resourcesDirConfigValue) 
            def currentCopyResTask = tasks.create(
                name: "copy$targetNameBundledResources",
                type: Copy) 
                group = "react"
                description = "copy bundled resources into custom location for $targetName."

                from resourcesDir
                into file(resourcesDirConfigValue)

                dependsOn(currentBundleTask)

                enabled currentBundleTask.enabled


            

            packageTask.dependsOn(currentCopyResTask)
        

        def currentAssetsCopyTask = tasks.create(
            name: "copy$targetNameBundledJs",
            type: Copy) 
            group = "react"
            description = "copy bundled JS into $targetName."

            if (config."jsBundleDir$targetName") 
                from jsBundleDir
                into file(config."jsBundleDir$targetName")
             else 
                into ("$buildDir/intermediates")
                into ("assets/$targetPath") 
                    from jsBundleDir
                

                // Workaround for Android Gradle Plugin 3.2+ new asset directory
                into ("merged_assets/$targetPath/merge$targetNameAssets/out") 
                    from jsBundleDir
                
            

            // mergeAssets must run first, as it clears the intermediates directory
            dependsOn(variant.mergeAssets)

            enabled currentBundleTask.enabled
        

        packageTask.dependsOn(currentAssetsCopyTask)
    

Crédito: ZeroCool00 mkchx

(ACTUALIZADO)

Esta solución funciona para mi

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

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

En mi caso, la compilación falló porque hay recursos duplicados en mi proyecto de Android (dentro de la carpeta de Android), estas dos líneas son necesarias para eliminar los recursos duplicados, eso es todo.

Para generar apk de depuración

"debug-build": "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/ && cd android && ./gradlew assembleDebug && cd .."

Para generar apk de lanzamiento

"release-build": "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/build/intermediates/res/merged/release/ && rm -rf android/app/src/main/res/drawable-* && rm -rf android/app/src/main/res/raw/* && cd android && ./gradlew assembleRelease && cd .."

Funciona bien para mi react-native> = 0.61.2 proyecto usando el código anterior en mi guiones Sección de package.json expediente.

Te mostramos las comentarios y valoraciones de los usuarios

Si entiendes que te ha sido útil nuestro post, nos gustaría que lo compartas con más programadores y nos ayudes a extender esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *