Утилита instanceState для Android активирована во время обновления приложения?

В 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$2.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 способен сериализовать класс, но не может десериализовать класс.

Единственная причина, по которой мы сейчас можем думать, - это обновление приложения (через Play Store). Между версией класс изменяется (из-за Dexguard), делая невозможным десериализацию.

Итак, мой вопрос: удаляет ли Android весь экземпляр приложения при обновлении приложения или нет?

Ответ 1

Вы не должны включать пользовательские классы в сохраненный экземплярState, если есть вероятность, что эти классы изменятся (даже если это только DexGuard, перетасовывая имена вокруг). Система сохраняет некоторую информацию о последних действиях и может попытаться повторно использовать ее при обновлении.

Ответ 2

Насколько я знаю, единственное условие, при котором система восстанавливает состояние Activity, когда оно полностью уничтожено, - это когда система должна была уничтожить эту операцию для восстановления системной памяти. Во всех остальных случаях (принудительный процесс остановки, переустановка приложения, перезагрузка устройства) состояние теряется.

Что касается переустановки, вы должны учитывать, что при установке новой версии приложения вы, вероятно, изменили или удалили одно или несколько действий, а состояние старых действий, вероятно, не может соответствовать состоянию новых. Предположим, например, что в одном приложении Activity есть TextView с идентификатором "@+ id/my_text". Через несколько дней вы решили удалить TextView и присвоить id "my_text" другому представлению - например, Spinner: как система могла восстановить текст TextView в Spinner?