罕见Fragment$InstantiationException异常:实例化非Fragment类问题咨询
异常原因分析:android.app.Fragment$InstantiationException 实例化非Fragment类
这个异常极为罕见,发生率不超过0.01%,仅因应用安装基数庞大才在统计分析中被观测到。
现有代码结构
public class AppCompatFoo extends AppCompatActivity { ... } public class AppFooActivity extends AppCompatFoo { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); .... } }
异常信息
调用super.onCreate(savedInstanceState)时偶尔抛出以下异常:
android.app.Fragment$InstantiationException Stack trace: android.app.Fragment$InstantiationException: Trying to instantiate a class androidx.lifecycle.y that is not a Fragment at android.app.Fragment.instantiate(Fragment.java:538) at android.app.FragmentContainer.instantiate(FragmentContainer.java:53) at android.app.FragmentState.instantiate(FragmentState.java:77) at android.app.FragmentManagerImpl.restoreAllState(FragmentManagerImpl.java:2867) at android.app.FragmentController.restoreAllState(FragmentController.java:142) at android.app.Activity.onCreate(Activity.java:1501) at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:88) at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:363) at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:217)
可能的触发原因
- 混淆导致的状态数据错误:ProGuard/R8混淆过程中,错误修改了Fragment状态保存时关联的类信息,将
androidx.lifecycle相关混淆类(y)标记为需要恢复的Fragment类型,导致系统在恢复Activity状态时尝试实例化该非Fragment类。 - 原生与AndroidX Fragment体系冲突:Activity基于AndroidX的
AppCompatActivity实现,但异常栈显示系统调用了原生android.app.Fragment的实例化逻辑。若应用中同时混用原生Fragment和AndroidX Fragment,可能会在状态恢复时出现类型识别混乱,误将Lifecycle组件当作原生Fragment处理。 - SavedInstanceState数据损坏:进程异常回收、内存波动等场景下,
savedInstanceStateBundle的数据出现损坏,原本存储Fragment状态的字段被写入了Lifecycle类的标识,系统恢复时就会触发错误的实例化操作。 - 系统底层兼容性Bug:部分老旧Android系统版本在处理AndroidX组件与原生组件交互时存在底层逻辑漏洞,极端场景下会引发状态恢复时的类型匹配错误,不过这种情况发生概率极低。
内容的提问来源于stack exchange,提问作者Hong
相关产品推荐
相关产品推荐

