更新targetSdkVersion至34后,Play商店中App出现大量Fragment实例化崩溃
问题描述
我在多部手机上测试应用均正常,但Play商店在短短几天内收到了超过5000条崩溃报告。最近的版本中仅将targetSdkVersion从31更新至34。
崩溃堆栈信息
Exception java.lang.RuntimeException: Unable to start activity ComponentInfo{MyAppPackage/MyAppPackage.MainActivity}: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.swmansion.rnscreens.ScreenStackFragment: calling Fragment constructor caused an exception at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3502) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3683) at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:85) 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:2108) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loop (Looper.java:223) at android.app.ActivityThread.main (ActivityThread.java:7948) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:603) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:947) Caused by androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment com.swmansion.rnscreens.ScreenStackFragment: calling Fragment constructor caused an exception at androidx.fragment.app.Fragment.instantiate (Fragment.java:631) at androidx.fragment.app.FragmentContainer.instantiate (FragmentContainer.java:57) at androidx.fragment.app.FragmentManager$3.instantiate (FragmentManager.java:483) at androidx.fragment.app.FragmentStateManager.<init>(FragmentStateManager.java:85) at androidx.fragment.app.FragmentManager.restoreSaveState (FragmentManager.java:2728) at androidx.fragment.app.FragmentController.restoreSaveState (FragmentController.java:198) at androidx.fragment.app.FragmentActivity$2.onContextAvailable (FragmentActivity.java:149) at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable (ContextAwareHelper.java:99) at androidx.activity.ComponentActivity.onCreate (ComponentActivity.java:322) at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:273) at com.facebook.react.ReactActivity.onCreate (ReactActivity.java:45) at MyAppPackage.MainActivity.onCreate (MainActivity.java:13) at android.app.Activity.performCreate (Activity.java:8071) at android.app.Activity.performCreate (Activity.java:8054) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3472) Caused by java.lang.reflect.InvocationTargetException: at java.lang.reflect.Constructor.newInstance0 at java.lang.reflect.Constructor.newInstance (Constructor.java:343) at androidx.fragment.app.Fragment.instantiate (Fragment.java:613) Caused by java.lang.IllegalStateException: Screen fragments should never be restored. Follow instructions from https://github.com/software-mansion/react-native-screens/issues/17#issuecomment-<US_SOCIAL_SECURITY_NUMBER> to properly configure your main activity. at com.swmansion.rnscreens.ScreenFragment.<init>(ScreenFragment.kt:54) at com.swmansion.rnscreens.ScreenStackFragment.<init>(ScreenStackFragment.kt:35)
我的Android build.gradle配置
buildToolsVersion = "34.0.0" minSdkVersion = 21 compileSdkVersion = 31 targetSdkVersion = 34 kotlin_version = '1.6.10'
解决方案
崩溃根源是升级targetSdkVersion到34后,Android系统自动恢复Fragment状态的机制与react-native-screens的设计冲突——该库不允许系统恢复Screen相关Fragment。按以下步骤修复:
修改MainActivity
将MainActivity继承的ReactActivity替换为ReactFragmentActivity,并在onCreate方法中传入null作为savedInstanceState参数,阻止系统恢复Fragment状态:若使用Java:
import android.os.Bundle; import com.facebook.react.ReactFragmentActivity; public class MainActivity extends ReactFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(null); } }若使用Kotlin:
import android.os.Bundle import com.facebook.react.ReactFragmentActivity class MainActivity : ReactFragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(null) } }升级react-native-screens版本
确保使用该库的最新稳定版,避免版本与targetSdk34存在兼容性问题。重新构建并发布
同步gradle配置,重新编译应用后发布新版本到Play商店。
内容的提问来源于stack exchange,提问作者umair ali
相关产品推荐
相关产品推荐

