生成apk时React Native Android重复文件错误

时间:2017-11-02 21:17:34

标签: android react-native apk

当我尝试使用./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文件夹,但它也没有帮助。

9 个答案:

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

您可以创建脚本来自动执行此操作。

  1. 创建android-react-gradle-fix文件
  2. 创建脚本android-release-gradle-fix.js文件
  3. 更新chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { console.log("script"); }); 文件:

    “scripts”:{     “postinstall”:“node ./android-release-gradle-fix.js” },

  4. 就是这样!运行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 Caoawesome 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 / app / src / main / res / drawable文件夹(如果不存在,则创建一个“ drawable”文件夹)
  • 删除所有带有后缀(即drawable-hdpi,drawable-mdpi等)的drawable文件夹
  • 不捆绑资产(即不运行:react-native捆绑……)
  • 运行Gradle的assembleRelease

但是,这不是理想的解决方案,因为对于所有设备尺寸,每个图像将只有一个分辨率。对于对于设备而言太大的图像,它将缩小到设备的尺寸,并导致下载大小和速度问题;对于对于设备而言太小的图像,则会导致图像质量下降。

我找到了一个方便的解决方案,就是使用一个名为Android Drawable Importer的Android Studio插件。要在安装后使用它:

  • 在Android Studio中打开您的项目,然后导航至:android / app / src / main / res / drawable
  • 右键单击该文件夹,然后选择:新建>批量可绘制导入
  • 选择并配置要导入的图像资产

该插件将处理可绘制文件夹的生成和正确的图像大小。导入图像后,您应该能够运行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