React Native Duplicate resources

前端 未结 8 646
感情败类
感情败类 2020-12-06 06:10

After upgrading to React Native 0.57 i am facing an issue when genrating APK in react-native-router-flux.when executing the .\\gradlew assembleRelease i get below error :-<

相关标签:
8条回答
  • 2020-12-06 06:34

    It is easy! just delete drawable and raw folder under app/src/main/res

    0 讨论(0)
  • 2020-12-06 06:35

    react.gradle automatically build your javascript and copy any resources imported inside your javascript to the build folder so make sure to NOT call react-native bundle manually and delete any files or folder as src/main/res/drawable-* and src/main/assets/*.bundle and have the following changes into your app/bundle.gradle

    project.ext.react = [
      entryFile      : "index.js", // or index.android.js
      bundleInRelease: true,
      bundleInDebug: true
    ]
    
    apply from: "../../node_modules/react-native/react.gradle"
    

    Note: please notice that some react-native versions have a problem with the local cli.js please make sure to upgrade to a newer version or try adding the following config

     project.ext.react = [
        // ...
        cliPath: "node_modules/react-native/local-cli/cli.js"
     ]
    
    0 讨论(0)
  • 2020-12-06 06:35

    There is another way to resolve this issue. For me, just adding below code in my project's android/build.gradle worked:

    subprojects {
        afterEvaluate {project ->
            if (project.hasProperty("android")) {
                android {
                    compileSdkVersion 27
                    buildToolsVersion "27.0.2"
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-06 06:38

    I am using:

    "react": "^16.5.2",
    "react-native": "0.57.1",
    

    I modified my app's build.gradle like this

    ext.react = [
            entryFile: "index.js",
            bundleInRelease       : true,
            resourcesDirRelease   : "src/main/res"
    ]
    apply plugin: 'com.android.application'
    import com.android.build.OutputFile
    
    //using custom react gradle here to get around https://stackoverflow.com/questions/52464842/react-native-duplicate-resources
    apply from: "../react.gradle"
    //apply from: "../../node_modules/react-native/react.gradle"
    apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
    

    and then my custom react.gradle looks like this

    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"
    
    // because elvis operator
    def elvisFile(thing) {
        return thing ? file(thing) : null;
    }
    
    def reactRoot = elvisFile(config.root) ?: file("../../")
    def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]
    def bundleConfig = config.bundleConfig ? "${reactRoot}/${config.bundleConfig}" : null ;
    
    void runBefore(String dependentTaskName, Task task) {
        Task dependentTask = tasks.findByPath(dependentTaskName);
        if (dependentTask != null) {
            dependentTask.dependsOn task
        }
    }
    
    afterEvaluate {
        def isAndroidLibrary = plugins.hasPlugin("com.android.library")
        // Grab all build types and product flavors
        def buildTypes = android.buildTypes.collect { type -> type.name }
        def productFlavors = android.productFlavors.collect { flavor -> flavor.name }
    
        // When no product flavors defined, use empty
        if (!productFlavors) productFlavors.add('')
    
        productFlavors.each { productFlavorName ->
            buildTypes.each { buildTypeName ->
                // Create variant and target names
                def flavorNameCapitalized = "${productFlavorName.capitalize()}"
                def buildNameCapitalized = "${buildTypeName.capitalize()}"
                def targetName = "${flavorNameCapitalized}${buildNameCapitalized}"
                def targetPath = productFlavorName ?
                        "${productFlavorName}/${buildTypeName}" :
                        "${buildTypeName}"
    
                // React js bundle directories
                def jsBundleDirConfigName = "jsBundleDir${targetName}"
                def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?:
                        file("$buildDir/intermediates/assets/${targetPath}")
    
                def resourcesDirConfigName = "resourcesDir${targetName}"
                def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?:
                        file("$buildDir/intermediates/res/merged/${targetPath}")
                def jsBundleFile = file("$jsBundleDir/$bundleAssetName")
    
                // Bundle task name for variant
                def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets"
    
                // Additional node and packager commandline arguments
                def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
                def extraPackagerArgs = config.extraPackagerArgs ?: []
    
                def currentBundleTask = tasks.create(
                        name: bundleJsAndAssetsTaskName,
                        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.mkdirs()
                        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
    
                    // Set up the call to the react-native cli
                    workingDir reactRoot
    
                    // Set up dev mode
                    def devEnabled = !(config."devDisabledIn${targetName}"
                            || targetName.toLowerCase().contains("release"))
    
                    def extraArgs = extraPackagerArgs;
    
                    if (bundleConfig) {
                        extraArgs = extraArgs.clone()
                        extraArgs.add("--config");
                        extraArgs.add(bundleConfig);
                    }
    
                    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                        commandLine("cmd", "/c", *nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
                                "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
                    } else {
                        commandLine(*nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "android", "--dev", "${devEnabled}",
                                "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
                    }
    
                    enabled config."bundleIn${targetName}" ||
                            config."bundleIn${buildTypeName.capitalize()}" ?:
                            targetName.toLowerCase().contains("release")
    
                }
    
                // Hook bundle${productFlavor}${buildType}JsAndAssets into the android build process
                currentBundleTask.dependsOn("merge${targetName}Resources")
                currentBundleTask.dependsOn("merge${targetName}Assets")
    
                runBefore("process${flavorNameCapitalized}Armeabi-v7a${buildNameCapitalized}Resources", currentBundleTask)
                runBefore("process${flavorNameCapitalized}X86${buildNameCapitalized}Resources", currentBundleTask)
                runBefore("processUniversal${targetName}Resources", currentBundleTask)
                runBefore("process${targetName}Resources", currentBundleTask)
                runBefore("dataBindingProcessLayouts${targetName}", currentBundleTask)
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-06 06:41

    This worked for me:

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

    In my project, build failed because there is a duplicated resources in my Android project. This line is necessary to remove duplicated resources.

    0 讨论(0)
  • 2020-12-06 06:50

    You can try to clean catch memory and reinstall node modules

    watchman watch-del-all
    rm -rf node_modules && npm install
    rm -fr $TMPDIR/react-*
    npm cache clean
    npm start -- --reset-cache
    

    It's work for me.

    0 讨论(0)
提交回复
热议问题