升级至React Native 0.58后自定义Android BuildTypes失效求助
我之前也碰到过一模一样的情况——Gradle插件3.2.x对构建目录结构做了不少调整,你配置的jsBundleDirReleaseStaging和resourcesDirReleaseStaging路径已经不符合新版Gradle的目录规范,导致生成的index.android.bundle没有被正确打包到APK的assets目录里,这就是启动崩溃的核心原因。
下面给你几个可行的解决方案,按优先级尝试:
方案1:移除手动指定的资源路径配置
React Native的Gradle插件在适配新版Gradle时,已经能自动推导自定义构建类型的bundle和资源路径,你手动指定的旧路径反而会干扰它的工作。修改project.ext.react配置,去掉那两个路径项:
project.ext.react = [ entryFile: "index.js", bundleInReleaseStaging: true, devDisabledInReleaseStaging: true // 移除jsBundleDirReleaseStaging和resourcesDirReleaseStaging这两行 ]
保留bundleInReleaseStaging: true和devDisabledInReleaseStaging: true就足够了,插件会自动处理bundle的生成和打包路径。
方案2:修正路径配置适配新版Gradle
如果你确实需要手动指定路径,把路径改成新版Gradle对应的目录:
project.ext.react = [ entryFile: "index.js", bundleInReleaseStaging: true, devDisabledInReleaseStaging: true, // 适配Gradle 3.2+的assets路径 jsBundleDirReleaseStaging: "$buildDir/intermediates/assets/releaseStaging", // 资源目录也同步调整 resourcesDirReleaseStaging: "$buildDir/intermediates/res/merged/releaseStaging" ]
注意:如果你的项目有productFlavors,路径里还需要加上flavor名称,比如$buildDir/intermediates/assets/releaseStaging/[yourFlavor]。
方案3:强制关联bundle生成任务
如果上面两种方法都没生效,可能是releaseStaging的构建任务没有触发bundle生成操作。可以在android/app/build.gradle末尾添加以下代码,让assemble任务依赖于bundle任务:
afterEvaluate { // 确保构建releaseStaging前先执行bundle生成 assembleReleaseStaging.dependsOn bundleReleaseStagingJsAndAssets }
这样每次执行./gradlew assembleReleaseStaging时,都会先生成bundle文件,再打包到APK里。
最后,执行构建前记得先清理一下旧的构建缓存:./gradlew clean,然后再重新构建releaseStaging包,应该就能正常启动了。
内容的提问来源于stack exchange,提问作者Konstantin Kuznetsov

