我试图从Android创建发布apk文件,但是当我使用PNG图片创建发布apk时,出现Duplicate Resource
错误。最初,我以为是因为我在现有项目中犯了一个错误,但是当我使用一个单独的Image
组件创建一个新项目时,却遇到了Duplicate Resource
错误。这是我遵循的步骤
react-native init demo
PNG
图像。Image
图片来实现PNG
组件。现在使用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/
然后使用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
答案 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
在项目({project-root} / android / fixAndroid)的“ android”文件夹中创建文件夹“ fixAndroid”。
在项目的“ 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
在创建的“ 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)
}
将脚本添加到package.json脚本部分:
"postinstall": "node ./android/fixAndroid/android-release-fix.js"
这将找到“ android-gradle-fix”文件的内容并将其插入到node_modules / react-native / react.gradle中。
现在,您可以在控制台或Android Studio上将发行版与React Native捆绑在一起:
反应本机命令行
cd {project-root}/android
./gradlew/bundleRelease
Android Studio
答案 3 :(得分:3)
对于最新版本的React-Native和gradle,您不需要捆绑资产。完成代码后,只需将cd插入android文件夹并运行:
./gradlew assembleRelease
在执行上述命令时,资产将自动捆绑在一起。出现重复资源错误,因为您之前已明确捆绑了该捆绑包,然后再次运行上述命令捆绑包,因此出现此错误。
答案 4 :(得分:2)
! 我认为这个问题已经在这里呆了这么长时间是绝对糟糕的,但是在研究了不同的解决方案之后,我想分享解决问题的方法。
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)
在 src-> main-> res 文件夹中,然后
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
答案 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中构建存在问题
此问题可能与以下内容重复:
如果仍然无法正常运行,请尝试使用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文件之类的解决方案可能有效,但它们只是解决方法。真正的解决方案在于找出问题所在。
如果仅在创建发行版时发生,那么您可能会单独捆绑。如果您要从没有React.gradle文件的较早版本的react native升级,则必须单独捆绑,然后执行``cd android && ./gradlew assembleRelease'',但引入了react.gradle捆绑现在,react.gradle文件已经处理好了该过程,因此不要单独捆绑,只需运行“ cd android && ./gradlew clean && ./gradlew assembleRelease”以构建发行版apk。
如果这也发生在调试中,则可能是某些生成的资产或所有生成的资产已被推送并当前位于您的目录中。因此,我建议将它们全部从各自的目录中删除,如果它们被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/
问题在这里。
我解决了这个问题:
删除android/app/res
中的重复文件
(如果您的资源是从React Native导入的,则可以直接在res下删除该目录)。
删除App/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/
更改为
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle
不再指定--assets-dest
运行命令
Generate Signed APK
正确打包。以上