【问题标题】:gradlew assembleRelease command in react-native android is not generating the app-release.apkreact-native android中的gradlew assembleRelease命令未生成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 文件在不同的文件夹中被添加了两次。

【问题讨论】:

标签: android android-studio react-native


【解决方案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/
          

          【讨论】:

            猜你喜欢
            • 2017-12-15
            • 1970-01-01
            • 2019-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多