React Native Android发布版启动崩溃问题排查求助
你碰到的这两个问题在React Native集成OneSignal的发布版构建里挺常见的,我来帮你一步步拆解解决:
问题1:OneSignal获取Google注册ID失败,抛出java.lang.NoClassDefFoundError: com.google.android.gms.common.util.zzs
这个错误大概率是Google Play Services依赖版本冲突,或者发布版混淆把关键类给搞没了,试试下面的方案:
统一Google Play Services依赖版本
先在项目根目录的build.gradle里加个全局版本配置,避免不同依赖用不同版本导致冲突:buildscript { ext { googlePlayServicesVersion = "17.0.0" // 选一个和OneSignal兼容的稳定版本 oneSignalVersion = "4.8.3" // 对应OneSignal的适配版本 } }然后在app模块的
build.gradle里引用这个全局版本:dependencies { implementation "com.google.android.gms:play-services-base:${googlePlayServicesVersion}" implementation "com.google.android.gms:play-services-gcm:${googlePlayServicesVersion}" implementation "com.onesignal:OneSignal:${oneSignalVersion}" }修复代码混淆规则
发布版默认开混淆,很可能把Google Play Services或OneSignal的核心类混淆了。在app/proguard-rules.pro里加上这些规则:# 保留Google Play Services相关类 -keep class com.google.android.gms.** { *; } -dontwarn com.google.android.gms.** # 保留OneSignal相关类 -keep class com.onesignal.** { *; } -dontwarn com.onesignal.**检查Multidex配置
如果应用方法数超过65k,发布版可能因为Multidex没配好导致类找不到。在app模块的build.gradle里启用Multidex:android { defaultConfig { multiDexEnabled true } } dependencies { implementation 'androidx.multidex:multidex:2.0.1' }然后让你的Application类继承
MultiDexApplication,或者在attachBaseContext里初始化:public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
问题2:Module AppRegistry is not a registered callable module
这个错误一般是发布版JS bundle没正确生成/打包,或者入口组件注册出问题了,试试这些方法:
手动生成发布版JS bundle
有时候自动构建可能漏了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/执行完再跑
gradlew assembleRelease,确保bundle被包含进APK。检查入口组件注册
确认index.js(或index.android.js)里的注册代码没问题:import { AppRegistry } from 'react-native'; import App from './App'; import { name as appName } from './app.json'; AppRegistry.registerComponent(appName, () => App);注意
appName必须和app.json里的name字段完全一致。临时禁用Hermes排查
如果开了Hermes引擎,可能是Hermes编译出问题导致bundle异常。在app模块的build.gradle里先关掉:project.ext.react = [ enableHermes: false, // 改为false ]然后清缓存重新构建:
./gradlew clean 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/ ./gradlew assembleRelease如果崩溃消失,说明是Hermes的配置问题,可以尝试更新版本或调整配置。
彻底清理构建缓存
旧缓存也可能搞出奇怪问题,执行这些命令清干净:./gradlew clean rm -rf node_modules npm install rm -rf android/app/build rm -rf android/build之后再重新生成bundle和构建发布版。
建议先解决第一个NoClassDefFoundError问题,因为OneSignal初始化失败可能会打断整个应用启动流程,间接导致AppRegistry没注册成功。
内容的提问来源于stack exchange,提问作者nbokmans

