react-native android中的gradlew assembleRelease命令未生成app-release.apk

Posted

技术标签:

【中文标题】react-native android中的gradlew assembleRelease命令未生成app-release.apk【英文标题】:gradlew assembleRelease command in react-native android is not generating the app-release.apk 【发布时间】:2017-12-19 04:34:17 【问题描述】:

我想在没有 react-packager 服务器的情况下生成未签名的 app-release.apk。 为此,我正在运行以下命令。

cd react-native-project-dir

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

执行以下命令后,我在命令提示符中收到如下错误:

cd android && gradlew assemblerelease

app:processReleaseManifestessReleaseManifest

:app:processReleaseResources D:\ReactNativeProject\android\app\build\intermediates\res\merged\release\drawable-mdpi-v4\image_background_unique_2.jpg:错误:重复文件。 D:\ReactNativeProject\android\app\build\intermediates\res\merged\release\drawable-mdpi\image_background_unique_2.jpg:原文在这里。版本限定符可能是隐含的。 :app:processReleaseResources 失败

FAILURE:构建失败并出现异常。

出了什么问题: 任务“:app:processReleaseResources”执行失败。 com.android.ide.common.process.ProcessException:无法执行 aapt

而且我无法生成 app-release.apk,也不明白为什么 image_background_unique_2.jpg 文件在不同的文件夹中被添加了两次。

【问题讨论】:

请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 你使用 Create React Native Application 了吗? 我用过 react-native init projectName 当我删除我的可绘制文件夹时,我收到如下错误:无法处理传入事件“ProgressComplete”(ProgressCompleteEvent) 【参考方案1】:

问题是新版本的 react-native 将资产捆绑在 /app/build/intermediates/res/merged/release 下而不是 app/src/main/res 下

为了解决这个问题,我就是这样做的

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

现在使用此命令捆绑资产:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/build/intermediates/res/merged/release/

请注意上述命令中更新的--assets-dest。之后组装 APK 工作正常!

react-native run-android --variant=release

【讨论】:

我想吻你,但我不能,所以请多多谢! =D 请注意,对我来说删除android/app/src/main/res/drawable-* 破坏了构建,但其余的工作正常。如果我可以多次投票,我会的。 正如 akaMahesh 在接受的答案中评论的那样,如果我的资产在其中,我应该如何删除我的可绘制目录? @Ash drawable 应该是一个生成的目录 - 资产通常在您的 react native 源目录中,而不是在 android 目录中。删除drawables应该没问题,因为当您运行react-native bundle命令时,资产会被复制 我不得不用 index.js 重命名 index.android.js。谢谢@IndivisionDev【参考方案2】:

我试图按照https://facebook.github.io/react-native/docs/signed-apk-android.html 中的步骤生成签名的 APK 以生成签名的 apk。

我有同样的问题。当我运行./gradlew assembleRelease 时,为我的一些图像显示error: Duplicate fileassembleRelease 似乎会导致 drawable- 文件夹出现一些问题。我从/android/app/src/main/res/ 中删除了所有drawable- 文件夹。然后我再次运行 ./gradlew assembleRelease。最后,它在/android/app/build/outputs/apk/生成了一个签名的APK。

【讨论】:

老兄,它们是我应用程序所需的资源文件,我不能删除它们吗? @akaMahesh 是的,好问题。我想知道同样的事情。 删除文件导致出现新错误。 ./gradlew assembleRelease 无法处理其他资源。【参考方案3】:

您似乎捆绑了您的应用程序并使用assembleDebug 将其安装到您的手机上。当您决定使用assembleRelease 时,您应该删除drawable- 文件夹。当您决定生成 .apk 文件时,它们会以某种方式产生问题。

【讨论】:

通过删除 drawable- 文件夹,我在终端包中得到以下信息:将包输出写入:包:完成复制资产失败:构建失败并出现异常。 * 出了什么问题:无法处理传入事件“ProgressComplete”(ProgressCompleteEvent) 无法从错误中得到太多。当我再次阅读您的问题时,AFAIK 如果您想要未签名的 apk,则不需要 assembleRelease【参考方案4】:

您是否尝试过 react native clean build ?尝试重置缓存,然后捆绑。也许它会解决这个问题。

【讨论】:

【参考方案5】:

我已经设法通过删除 react native /android/app/build/intermediates/res/merged/release/drawable-mdpi 中的文件夹副本来解决这个问题

【讨论】:

【参考方案6】:

首先通过键入以下内容删除所有可能导致此错误的文件夹:

rm -rf ./android/app/build/intermediates/res/merged/release/drawable-*

然后将mdpi改为mdpi-v4 in:

./node_modules/react-native/local-cli/bundle/assetPathUtils.js

function getAndroidAssetSuffix(scale) 
  switch (scale) 
    case 0.75: return 'ldpi';
    case 1: return 'mdpi-v4';
    case 1.5: return 'hdpi';
    case 2: return 'xhdpi';
    case 3: return 'xxhdpi';
    case 4: return 'xxxhdpi';
  

然后捆绑您的离线包括:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/build/intermediates/res/merged/release/

最终构建您的应用的发布版本:

cd ./android && ./gradlew assembleRelease

【讨论】:

【参考方案7】:

这对我有用

将以下代码添加到文件 node_modules/react-native/react.gradle :

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

在 def currentBundleTask = tasks.create(...

在这里https://github.com/facebook/react-native/issues/5787找到这个解决方案

【讨论】:

【参考方案8】:

你可以做一件事来调试,让 react native bundle 在命令下运行

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

发布:

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/

【讨论】:

以上是关于react-native android中的gradlew assembleRelease命令未生成app-release.apk的主要内容,如果未能解决你的问题,请参考以下文章

Android模拟器中的React-Native Runnable错误

Android react-native 中的 MainActivity 不存在错误

关于Webstorm运行react-native中的Android项目出错的解决办法

在react-native中,我如何在ios和android的图像上添加水印

React-Native:如何缩放字体大小以支持 Android 和 iOS 中的许多不同分辨率和屏幕?

react-native中的import com.android.build.OutputFile错误