当我尝试使用./gradlew installRelease
生成android apk时,我在控制台中收到此错误:
~/React-Native/mockingbird/android/app/build/intermediates/res/merged/release/drawable-mdpi-v4/src_resources_img_loading.gif: error: Duplicate file.
~/React-Native/mockingbird/android/app/build/intermediates/res/merged/release/drawable-mdpi/src_resources_img_loading.gif: Original is here. The version qualifier may be implied.
我通过Android Studio尝试Build->Clean Project
并再次运行./gradlew installRelease
;它也没有用。
另外,我尝试删除build
文件夹,但它也没有帮助。
答案 0 :(得分:113)
给你一些提示,希望它有效。
用“react”更新:“16.7.0”,“react-native”:“0.57.8”
自定义 node_modules / react-native / react.gradle 以完美解决重复文件错误。将以下代码添加到 currentBundleTask 的创建块(在doFirst块之后)
document.addEventListener("DOMContentLoaded", function(){
var btn=document.getElementById("submitButton");
var id;
chrome.tabs.query({currentWindow: true, active: true}, function(tabs){
id=tabs[0].id;
});
btn.addEventListener("click", function(){
console.log("clicked");
var myId=document.getElementById("myId").value;
chrome.tabs.executeScript({file: "getchanges.js"}, function(){
console.log("sending");
chrome.tabs.sendMessage(id, {myId: myId});
});
});
});
您可以创建脚本来自动执行此操作。
android-react-gradle-fix
文件android-release-gradle-fix.js
文件更新chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
console.log("script");
});
文件:
“scripts”:{ “postinstall”:“node ./android-release-gradle-fix.js” },
就是这样!运行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);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
以获得真棒。
注意:如果您在jenkins等ci上运行package.json
,则可能会收到错误:npm install
=>只需使用npm install
代替
答案 1 :(得分:32)
删除您可能拥有的文件:
android/app/src/main/res/drawable-mdpi/
android/app/src/main/res/drawable-xhdpi/
android/app/src/main/res/drawable-xxhdpi/
再次运行Build,这解决了我的问题。
答案 2 :(得分:25)
在撰写本文时,最新版本的React Native(> 0.57.0)已将Gradle包装器级别提高到4.4,将Gradle插件级别提高到3.1.4,如changelog所示。这样可以使Gradle构建过程将APT的结果(现在必需)存储在与以前不同的目录中。
在Nhan Cao的awesome workaround方面,我们需要进行一些修改以防止重复的资源冲突,因为它看起来是指向旧目录而不是应用程序的{{1} } 目录。通过更改在生成资源后将这些重复文件合并在一起的目标目录,我们仍然可以对资源进行重复配置。
现有的generated
引用以下路径:
react.gradle
重复的文件路径可能出现在以下位置:
$buildDir === <project-working-directory>/android/app/build
作为一种解决方法,我们可以按以下方式更新Nhan的解决方案(确保在file("$buildDir/../src/main/res/drawable-${resSuffix}")
file("$buildDir/generated/res/react/release/drawable-${resSuffix}")
中声明currentBundleTask
之后将其包含在doFirst
中:
react.gradle
答案 3 :(得分:13)
react-native bundle
之前运行./gradlew assembleRelease
。对于我自己,我在运行react-native bundle
之前正在运行./gradlew assembleRelease
。
我收到了与我的某个资产类似的重复错误消息。
查看./gradlew assembleRelease
输出,我可以告诉它自己构建JS包(感谢apply from: "../node_modules/react-native/react.gradle"
文件中的build.gradle
)所以没有必要手动运行{事先{1}}。
如果我在运行react-native bundle
之前没有运行react-native bundle
,那么一切都很顺利。
我测试了发布APK并且JS包很好地加载,包括所有图像。
我唯一关心的是是否会创建源映射./gradlew assembleRelease
(用于Bugsnag)。如果没有,我确信有--sourcemap-output
生成这些的方法。我还没有测试过它。
答案 4 :(得分:4)
为了使我的构建适用于React Native 0.57.5,我使用了Mapsy的答案并做了一些小的改进。我需要能够针对多种口味进行构建,并且通常我会尝试避免对事物进行硬编码。浏览我的react.gradle
文件时,发现它定义了以下变量:
def resourcesDir = file("$buildDir/generated/res/react/${targetPath}")
因此,无需像这样在路径中对构建类型/风味进行硬编码:
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
我改为使用resourcesDir
变量来设置originalDir
路径,如下所示:
File originalDir = file("${resourcesDir}/drawable-${resSuffix}");
结果,我的doLast
如下所示:
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);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
答案 5 :(得分:2)
对我来说,删除文件夹android/build
并再次运行./gradlew assembleRelease
是可行的。
答案 6 :(得分:1)
对我有用的只是在package.json
中添加此额外命令,然后将其用于构建:
"android-build-release": "cd ./android && rm -rf app/src/main/res/drawable* && ./gradlew app:assembleRelease",
答案 7 :(得分:0)
一种消除错误的方法是:
但是,这不是理想的解决方案,因为对于所有设备尺寸,每个图像将只有一个分辨率。对于对于设备而言太大的图像,它将缩小到设备的尺寸,并导致下载大小和速度问题;对于对于设备而言太小的图像,则会导致图像质量下降。
我找到了一个方便的解决方案,就是使用一个名为Android Drawable Importer的Android Studio插件。要在安装后使用它:
该插件将处理可绘制文件夹的生成和正确的图像大小。导入图像后,您应该能够运行Gradle的assembleRelease,而不会出现资源重复错误。
答案 8 :(得分:0)
1。删除drawable-xxx文件夹 2.删除原始 然后在src-> main-> res文件夹中
3。在终端中运行以下命令: 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
4。然后使用终端机或android studio使用密钥库,别名和密码生成签名的APK