React Native 0.70.6正式APK崩溃:无法加载脚本问题求助
React Native 0.70.6 正式APK崩溃:无法加载脚本问题
开发阶段执行npm run android一切正常,APK构建无报错,但正式APK启动后直接崩溃,捕获到如下错误:
java.lang.RuntimeException: Unable to load script. Make sure you're either running Metro (run 'npx react-native start') or that your bundle 'index.android.bundle' is packaged correctly for release. at com.facebook.react.bridge.CatalystInstanceImpl.jniLoadScriptFromAssets(Native Method) at com.facebook.react.bridge.CatalystInstanceImpl.loadScriptFromAssets(CatalystInstanceImpl.java:248) at com.facebook.react.bridge.JSBundleLoader$1.loadScript(JSBundleLoader.java:29) at com.facebook.react.bridge.CatalystInstanceImpl.runJSBundle(CatalystInstanceImpl.java:277) at com.facebook.react.ReactInstanceManager.createReactContext(ReactInstanceManager.java:1402) at com.facebook.react.ReactInstanceManager.access$1200(ReactInstanceManager.java:136) at com.facebook.react.ReactInstanceManager$5.run(ReactInstanceManager.java:1108) at java.lang.Thread.run(Thread.java:818)
项目相关配置
android/build.gradle
buildscript { ext { buildToolsVersion = "31.0.0" minSdkVersion = 21 compileSdkVersion = 31 targetSdkVersion = 31 if (System.properties['os.arch'] == "aarch64") { ndkVersion = "24.0.8215888" } else { ndkVersion = "21.4.7075529" } googlePlayServicesAuthVersion = "19.2.0" firebaseMessagingVersion = "21.1.0" } repositories { google() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle:7.2.1") classpath("com.facebook.react:react-native-gradle-plugin") classpath("de.undercouch:gradle-download-task:5.0.1") classpath 'com.google.gms:google-services:4.3.14' } } allprojects { repositories { maven { url("$rootDir/../node_modules/react-native/android") } maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } mavenCentral { content { excludeGroup "com.facebook.react" } } google() maven { url 'https://www.jitpack.io' } } }
android/app/build.gradle 核心配置
// other code ..... project.ext.react = [ enableHermes: true, entryFile: "index.js", bundleAssetName: "index.android.bundle", bundleInDebug: true, bundleInRelease: true ] def enableSeparateBuildPerCPUArchitecture = true def enableProguardInReleaseBuilds = true android { ndkVersion rootProject.ext.ndkVersion compileSdkVersion rootProject.ext.compileSdkVersion defaultConfig { applicationId "com.myapp" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() multiDexEnabled true if (isNewArchitectureEnabled()) { // We configure the CMake build only if you decide to opt-in for the New Architecture. externalNativeBuild { cmake { arguments "-DPROJECT_BUILD_DIR=$buildDir", "-DREACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid", "-DREACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build", "-DNODE_MODULES_DIR=$rootDir/../node_modules", "-DANDROID_STL=c++_shared" } } if (!enableSeparateBuildPerCPUArchitecture) { ndk { abiFilters (*reactNativeArchitectures()) } } } } splits { abi { reset() enable enableSeparateBuildPerCPUArchitecture universalApk true // If true, also generate a universal APK include (*reactNativeArchitectures()) } } signingConfigs { debug { storeFile file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } release { if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) { storeFile file(MYAPP_UPLOAD_STORE_FILE) storePassword MYAPP_UPLOAD_STORE_PASSWORD keyAlias MYAPP_UPLOAD_KEY_ALIAS keyPassword MYAPP_UPLOAD_KEY_PASSWORD } } } buildTypes { debug { signingConfig signingConfigs.debug } release { // Caution! In production, you need to generate your own keystore file. signingConfig signingConfigs.release minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } // other code ...... }
Java版本
Openjdk version "18.0.1.1" 2022-04-22 OpenJDK Runtime Environment Homebrew (build 18.0.1.1+0) OpenJDK 64-Bit Server VM Homebrew (build 18.0.1.1+0, mixed mode, sharing)
已尝试操作:新建纯净RN 0.70.6项目打包正常,但添加依赖后问题重现。
解决方法
1. 手动生成JS Bundle并验证
执行以下命令手动生成release版本的bundle文件:
npx 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/src/main/res/
执行完成后,检查android/app/src/main/assets/目录下是否存在index.android.bundle。如果不存在,说明bundle生成过程有隐藏错误,需查看命令输出排查问题。
2. 修复ProGuard规则
由于启用了ProGuard,需确保proguard-rules.pro中保留React Native和Hermes的核心代码,添加以下规则:
# React Native核心类 -keep class com.facebook.react.** { *; } -dontwarn com.facebook.react.** # Hermes引擎相关 -keep class com.facebook.hermes.** { *; } -dontwarn com.facebook.hermes.**
缺失这些规则会导致ProGuard混淆或删除必要代码,引发脚本加载失败。
3. 定位冲突依赖
因为纯净项目正常,添加依赖后出问题,逐个移除新增依赖,执行./gradlew clean后重新打包测试,找到引发问题的依赖。针对该依赖:
- 查看其官方文档,确认是否支持RN 0.70.6
- 检查是否需要额外的打包配置(比如ProGuard规则、bundle参数)
4. 验证Hermes配置
确认以下两点:
android/app/build.gradle中enableHermes: true配置正确- 解压APK,检查
lib/[abi]/目录下是否存在libhermes.so文件,若缺失说明Hermes未正确打包
5. 切换Java版本
RN 0.70.x官方推荐使用Java 11,当前Java 18可能存在兼容性问题。切换到OpenJDK 11后,重新执行打包流程测试。
内容的提问来源于stack exchange,提问作者nirks
相关产品推荐
相关产品推荐

