Android activity instanceState 是否在应用升级过程中清理?

Is the Android activity instanceState cleaned during app upgrade?

在 activity 的 instanceState 中,我们存储了一个 Serializable (bundle.putSerializable)。 在 Play 商店的崩溃报告中,我们看到了以下堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: o.ণ
at java.lang.Class.classForName(Class.java)
at java.lang.Class.forName(Class.java:308)
at android.os.Parcel.resolveClass(Parcel.java:2373)
at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1641)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:657)
at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1782)
at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
at android.os.Parcel.readSerializable(Parcel.java:2381)

我们的代码被 DexGuard 混淆了。 看起来 Android 能够序列化 class 但不能反序列化 class。

我们目前能想到的唯一原因是应用程序升级(通过 de Play 商店)。在版本之间 class 发生了变化(因为 Dexguard)使得反序列化变得不可能。

所以,我的问题是:Android是否在应用程序升级期间清除应用程序的所有instanceState?

据我所知,当 Activity 被完全销毁时,系统恢复其状态的唯一条件是系统必须销毁 Activity 以恢复系统内存。在所有其他情况下(强制停止进程、重新安装应用程序、重启设备)状态都会丢失。

关于重新安装,您必须考虑到当您安装新版本的应用程序时,您可能更改或删除了一个或多个活动,并且旧活动的状态可能与新活动的状态不匹配那些。例如,假设在单个 Activity 应用程序中,您有一个 ID 为“@+id/my_text”的 TextView。几天后,您决定删除 TextView 并将 id "my_text" 分配给另一个视图 - 例如 Spinner:系统如何恢复 Spinner 中 TextView 的文本?

如果 类 有可能发生变化(即使只是 DexGuard 改组名称),则不应在已保存的实例状态中包含自定义 类。系统会保存一些关于最近活动的信息,并可能会尝试在升级过程中重用这些信息。