React Native上架Google Play后报java.lang.RuntimeException异常
React Native 跨版本启动崩溃排查方案
发布全新React Native应用后,从Google Play开发者控制台获取到跨设备、跨Android版本均触发的启动崩溃,对应堆栈信息如下:
java.lang.RuntimeException: at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3555) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3707) at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2220) at android.os.Handler.dispatchMessage (Handler.java:107) at android.os.Looper.loop (Looper.java:237) at android.app.ActivityThread.main (ActivityThread.java:8019) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1100) Caused by: androidx.fragment.app.Fragment$InstantiationException: at androidx.fragment.app.Fragment.instantiate (Fragment.java:566) at androidx.fragment.app.FragmentContainer.instantiate (FragmentContainer.java:57) at androidx.fragment.app.FragmentManager$3.instantiate (FragmentManager.java:390) at androidx.fragment.app.FragmentStateManager.<init> (FragmentStateManager.java:74) at androidx.fragment.app.FragmentManager.restoreSaveState (FragmentManager.java:2454) at androidx.fragment.app.FragmentController.restoreSaveState (FragmentController.java:196) at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:287) at androidx.appcompat.app.AppCompatActivity.onCreate (AppCompatActivity.java:115) at com.facebook.react.ReactActivity.onCreate (ReactActivity.java:45) at com.marwan.mosaed.dietforever.MainActivity.onCreate (MainActivity.java:23) at android.app.Activity.performCreate (Activity.java:7957) at android.app.Activity.performCreate (Activity.java:7946) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1307) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3530) Caused by: java.lang.reflect.InvocationTargetException: at java.lang.reflect.Constructor.newInstance0 (Native Method) at java.lang.reflect.Constructor.newInstance (Constructor.java:343) at androidx.fragment.app.Fragment.instantiate (Fragment.java:548) Caused by: java.lang.IllegalStateException: at com.swmansion.rnscreens.ScreenFragment.<init> (ScreenFragment.kt:42)

根因定位
崩溃最终触发点是第三方依赖react-native-screens的ScreenFragment初始化失败:低版本react-native-screens的ScreenFragment没有定义公开无参构造函数,当应用被系统后台回收、配置变更(横竖屏切换、字体大小调整)触发Activity重建时,系统FragmentManager会尝试通过反射调用Fragment的无参构造恢复之前保存的实例状态,此时就会抛出异常直接导致应用启动崩溃。
修复方案
- 优先升级依赖版本:该问题在
react-native-screens3.4.0及以上版本已官方修复,直接升级到稳定版即可解决,推荐升级到3.20.0及以上正式版# npm安装 npm install react-native-screens@^3.20.0 # yarn安装 yarn add react-native-screens@^3.20.0 - 升级后清理构建缓存重新打包:进入安卓项目目录执行
./gradlew clean清理旧构建产物,再重新打release包验证,重点测试后台杀进程后重启、横竖屏切换两个场景,确认崩溃不再复现 - 临时规避方案:如果暂时无法升级依赖版本,可以在
MainActivity.java中重写onCreate方法,拦截系统自动恢复Fragment状态的逻辑,代码如下:@Override protected void onCreate(Bundle savedInstanceState) { // 移除Fragment恢复状态,规避ScreenFragment实例化崩溃 if (savedInstanceState != null) { savedInstanceState.remove("android:support:fragments"); savedInstanceState.remove("android:fragments"); } super.onCreate(savedInstanceState); } - 版本兼容校验:如果项目使用了
@react-navigation/native-stack等依赖react-native-screens的导航库,同步确认导航库版本和升级后的react-native-screens版本匹配,避免出现版本兼容问题。
内容的提问来源于stack exchange,提问作者Mohamed Mosaed
相关产品推荐
相关产品推荐

