React Native:错误:资源重复-Android

时间:2018-11-10 13:59:47

标签: react-native android-gradle react-native-android

我试图从Android创建发布apk文件,但是当我使用PNG图片创建发布apk时,出现Duplicate Resource错误。最初,我以为是因为我在现有项目中犯了一个错误,但是当我使用一个单独的Image组件创建一个新项目时,却遇到了Duplicate Resource错误。这是我遵循的步骤

  1. 创建一个应用-react-native init demo
  2. 在项目根文件夹中创建一个资源文件夹。
  3. 在资产文件夹中添加一个PNG图像。
  4. 现在使用上面的Image图片来实现PNG组件。
  5. 现在使用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. 然后使用Generate Signed APK中的Android Studio生成发行版APK。

这将引发以下错误:

[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

BUILD FAILED in 22s

注意:当您生成没有任何PNG图像的release apk时,不会出现任何错误,它将为您创建release apk

这是其他文件代码。

App.js

import React, {Component} from 'react';
import {Platform, StyleSheet, Image, View} from 'react-native';

export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Image source={require('./assets/mario.png')} />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

package.json

{
  "name": "errorCheck",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "react": "16.6.0-alpha.8af6728",
    "react-native": "0.57.4"
  },
  "devDependencies": {
    "babel-jest": "23.6.0",
    "jest": "23.6.0",
    "metro-react-native-babel-preset": "0.49.0",
    "react-test-renderer": "16.6.0-alpha.8af6728"
  },
  "jest": {
    "preset": "react-native"
  }
}

有什么解决办法吗?

更新

这是其他详细信息

classpath 'com.android.tools.build:gradle:3.1.4'

ext {
        buildToolsVersion = "27.0.3"
        minSdkVersion = 16
        compileSdkVersion = 27
        targetSdkVersion = 26
        supportLibVersion = "27.1.1"
    }

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

尝试过Android Studio 3.0, 3.0.1, 3.1, 3.1.4 & 3.2

22 个答案:

答案 0 :(得分:19)

尝试了很多解决方案后,我发现只有两个解决方案有效。他们在这里

解决方案1:

捆绑后,从drawable中删除Android Studio文件夹。您可以在android/app/src/main/res/drawable

中找到它

解决方案2:

在此解决方案中,您无需删除任何可绘制的文件夹。只需将以下代码添加到 react.gradle 文件中,即可在node_modules/react-native/react.gradle路径下找到

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

作为参考,我将在此处添加完整的 react.gradle 文件代码

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

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

            // 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${variant.buildType.name.capitalize()}" ?:
                targetName.toLowerCase().contains("release")
        }

        // 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${targetName}BundledResources",
                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${targetName}BundledJs",
            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${targetName}Assets/out") {
                    from jsBundleDir
                }
            }

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

            enabled currentBundleTask.enabled
        }

        packageTask.dependsOn(currentAssetsCopyTask)
    }
}

信用: ZeroCool00 mkchx

答案 1 :(得分:12)

此解决方案对我有用

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

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

答案 2 :(得分:5)

可接受的答案将起作用,但是并没有考虑到修改节点程序包意味着如果更新,更改将丢失(并且违反最佳实践,则应以某种方式扩展模块)。 / p>

这最初来自React-native android release error: duplicate resource

  1. 在项目({project-root} / android / fixAndroid)的“ android”文件夹中创建文件夹“ fixAndroid”。

  2. 在项目的“ fixAndroid”文件夹中创建文件android-gradle-fix({project-root} / android / fixAndroid / android-gradle-fix)。

            doLast {
        def moveFunc = { resSuffix ->
            File originalDir = file("${resourcesDir}/drawable-${resSuffix}")
            if (originalDir.exists()) {
                File destDir = file("${resourcesDir}/drawable-${resSuffix}-v4")
                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
    
  3. 在创建的“ fixAndroid”文件夹中创建文件android-release-fix.js:

            const fs = require('fs')
    
        try {
                var curDir = __dirname
                var rootDir = process.cwd()
    
                var file = `${rootDir}/node_modules/react-native/react.gradle`
                var dataFix = fs.readFileSync(`${curDir}/android-gradle-fix`, 'utf8')
                var data = fs.readFileSync(file, 'utf8')
    
                var doLast = "doLast \{"
                if (data.indexOf(doLast) !== -1) {
                    throw "Already fixed."
                }
    
                var result = data.replace(/\/\/ Set up inputs and outputs so gradle can cache the result/g, dataFix);
                fs.writeFileSync(file, result, 'utf8')
                console.log('Android Gradle Fixed!')
            } catch (error) {
                console.error(error)
            }
    
  4. 将脚本添加到package.json脚本部分:

    "postinstall": "node ./android/fixAndroid/android-release-fix.js"
    

这将找到“ android-gradle-fix”文件的内容并将其插入到node_modules / react-native / react.gradle中。

  1. 从项目的根目录运行npm install。
  2. 从项目的根目录运行rm -rf android / app / src / main / res / drawable-*。

现在,您可以在控制台或Android Studio上将发行版与React Native捆绑在一起:

反应本机命令行

  1. cd {project-root}/android
  2. ./gradlew/bundleRelease

Android Studio

  1. 在Android Studio中打开android文件夹并构建项目。
  2. 选择“构建/生成签名的APK”以构建发行版。

答案 3 :(得分:3)

对于最新版本的React-Native和gradle,您不需要捆绑资产。完成代码后,只需将cd插入android文件夹并运行:

./gradlew assembleRelease

在执行上述命令时,资产将自动捆绑在一起。出现重复资源错误,因为您之前已明确捆绑了该捆绑包,然后再次运行上述命令捆绑包,因此出现此错误。

答案 4 :(得分:2)

在RN中面临相同问题的

! 我认为这个问题已经在这里呆了这么长时间是绝对糟糕的,但是在研究了不同的解决方案之后,我想分享解决问题的方法。

Jeffrey Rajan对于https://stackoverflow.com/a/53260522/1611414

处的可能解决方案是绝对正确的

我认为在react.gradle中更改node_modules文件是非常糟糕的,并且在维护此RN项目时会导致很多不同的问题。因此,我建议选择第一个选项-在运行build之前使用bash命令删除该文件夹。

我想分享我在项目中所做的事情,也许您可​​以重用相同的方法:

// ./package.json

...
scripts: {
   "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/
          && rm -rf ./android/app/src/main/res/drawable-mdpi/
          && rm -rf ./android/app/src/main/res/raw/",

   "release": "yarn build && cd ./android && ./gradlew bundleRelease"
}
...

,通过执行yarn release运行发行版。

这些行非常重要:

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

它们在运行build之前从bundleRelease步骤中删除重复的资源。用RN 0.57、0.58、0.59和0.60测试溶液。

享受!

答案 5 :(得分:1)

对我来说,这是一个缓存问题。以下命令对我有用

cd进入android文件夹

运行./gradlew clean

答案 6 :(得分:1)

发布版本出错 /android/app/src/main/res/raw/app.json [raw/app] /android/app/build/generated/res/react/release/raw/app.json:错误:重复资源

删除/android/app/src/main/res/raw/app.json 然后 ./gradlew clean 在 android 文件夹中 然后 ./gradlew bundleRelease

答案 7 :(得分:1)

  1. 删除 drawable-xxx 文件夹
  2. 删除原始

src-> main-> res 文件夹中,然后

  1. 在终端中运行此命令:

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

  1. 然后使用终端机或android studio使用密钥库,别名和密码生成签名的APK

答案 8 :(得分:1)

尝试将另一个目录用于资产目标(例如res_temp)。

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

我还在gitignore中添加res_temp。 已在Gradle 6.0.1和RN 0.62.2中进行了测试

答案 9 :(得分:1)

解决方案
我刚刚清理gradlew并开始工作,无需更改
/node_modules/react-native/react.gradle

步骤
1)cd android && ./gradlew clean && cd ..
2)react-native run-android

"dependencies": {
    "react": "16.11.0",
    "react-native": "0.62.2",
}

答案 10 :(得分:0)

用于生成调试APK

"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 .."

用于生成发行版APK

"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 .."

对于我的本机> = 0.61.2 项目,可以通过在 package.json < / strong>文件。

答案 11 :(得分:0)

使用com.android.tools.build:gradle:3.1.4应该可以。 RN 0.57在3.2中构建存在问题

此问题可能与以下内容重复:

React Native Error: Duplicate resources, assets coming in some screens and not coming in others in android release APK

如果仍然无法正常运行,请尝试使用RN 0.57.2,我正在使用它,并且创建发行版对这些部门非常有效:

   "dependencies": {
    "react": "16.5.0",
    "react-native": "0.57.2",
    .......
  }

  "devDependencies": {
    "@babel/core": "^7.0.0",
    "@babel/plugin-proposal-class-properties": "^7.0.0",
    "@babel/plugin-proposal-decorators": "^7.0.0",
    "@babel/plugin-proposal-do-expressions": "^7.0.0",
    "@babel/plugin-proposal-export-default-from": "^7.0.0",
    "@babel/plugin-proposal-export-namespace-from": "^7.0.0",
    "@babel/plugin-proposal-function-bind": "^7.0.0",
    "@babel/plugin-proposal-function-sent": "^7.0.0",
    "@babel/plugin-proposal-json-strings": "^7.0.0",
    "@babel/plugin-proposal-logical-assignment-operators": "^7.0.0",
    "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0",
    "@babel/plugin-proposal-numeric-separator": "^7.0.0",
    "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
    "@babel/plugin-proposal-optional-chaining": "^7.0.0",
    "@babel/plugin-proposal-pipeline-operator": "^7.0.0",
    "@babel/plugin-proposal-throw-expressions": "^7.0.0",
    "@babel/plugin-syntax-dynamic-import": "^7.0.0",
    "@babel/plugin-syntax-import-meta": "^7.0.0",
    "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
    "@babel/plugin-transform-runtime": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "@babel/preset-flow": "^7.0.0",
    "@babel/register": "^7.0.0",
    "babel-core": "^7.0.0-bridge.0",
    "babel-preset-react-native-stage-0": "^1.0.1",
    .....
}

Grade deps:

classpath 'com.android.tools.build:gradle:3.1.4'
classpath "io.realm:realm-gradle-plugin:4.0.0"

应用gradle

compileSdkVersion 27
    buildToolsVersion "27.0.3"

    defaultConfig {
        applicationId "de.burda.buntede"
        minSdkVersion 17
        targetSdkVersion 27

渐变包装道具:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

答案 12 :(得分:0)

tolotrasmile的答案对我有用。

我将它包含在我想要构建和安装Android的小bash脚本中

        cd $PROJECT_DIRECTORY && 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

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

        cd $PROJECT_DIRECTORY/android/
        ./gradlew clean
        ./gradlew assembleRelease

        adb install -r $PROJECT_DIRECTORY/android/app/build/outputs/apk/release/app-release.apk

答案 13 :(得分:0)

因此,基本上编辑/node_modules/react-native/react.gradle文件 并手动在doFirst块之后添加doLast。

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

答案 14 :(得分:0)

要快速修复,请编辑/node_modules/react-native/react.gradle文件 并手动在doFirst块之后添加doLast。

doLast {     def moveFunc = {resSuffix->         文件originalDir = file(“ $ buildDir / generate / res / react / release / drawable-$ {resSuffix}”);         如果(originalDir.exists()){             文件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() }

答案 15 :(得分:0)

我正在使用本机0.63.2。我也遇到了这个问题,并尝试编辑react.gradle,删除资源/可绘制内容等。但是最后清理了gradle并运行了命令gradlew assembleRelease

我没有单独运行react-native bundle命令。 gradlew assembleRelease正在运行react-native捆绑包并自己构建apk。

答案 16 :(得分:0)

诸如修补react.gradle文件之类的解决方案可能有效,但它们只是解决方法。真正的解决方案在于找出问题所在。

  1. 如果仅在创建发行版时发生,那么您可能会单独捆绑。如果您要从没有React.gradle文件的较早版本的react native升级,则必须单独捆绑,然后执行``cd android && ./gradlew assembleRelease'',但引入了react.gradle捆绑现在,react.gradle文件已经处理好了该过程,因此不要单独捆绑,只需运行“ cd android && ./gradlew clean && ./gradlew assembleRelease”以构建发行版apk。

  2. 如果这也发生在调试中,则可能是某些生成的资产或所有生成的资产已被推送并当前位于您的目录中。因此,我建议将它们全部从各自的目录中删除,如果它们被git跟踪,则尝试将它们一一添加回去。我们有一些以src_assets_blahblah开头的资产,我们必须删除它们,因为它们已经在构建过程中生成。

答案 17 :(得分:0)

删除您可能拥有的文件:

android / app / src / main / res / drawable-mdpi / android / app / src / main / res / drawable-xhdpi / android / app / src / main / res / drawable-xxhdpi / 再次运行Build,这为我解决了这个问题。

答案 18 :(得分:0)

就我而言,它在Jaffrey's答案中添加了几行之后就起作用了

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

答案 19 :(得分:0)

所有建议的解决方案都不适合我

就我而言,它与 .gradle 文件夹有关。在收到此错误之前,我已将该文件夹移动到另一个磁盘,但某些文件无法复制到目标文件夹。

我只是剪切旧文件夹并将其与目标文件夹合并。

答案 20 :(得分:-1)

通过添加此内容在/node_modules/react-native/react.gradle

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

}

答案 21 :(得分:-4)

使用0.57.7后,我遇到了相同的问题, 查看node_modules/react-native/react.gradle文件, 资源输出目录为$buildDir/generated/res/react/${targetPath}。 将日志中的地址视为app/build/generated/res/react/release

命令 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/

资源输出目录是 android/app/src/main/res/

问题在这里。

我解决了这个问题:

  1. 删除android/app/res中的重复文件 (如果您的资源是从React Native导入的,则可以直接在res下删除该目录)。

  2. 删除App/build文件夹。

  3. 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/

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

不再指定--assets-dest 运行命令

  1. 使用Android Studio的Generate Signed APK正确打包。

以上