Утилита 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 весь экземпляр приложения при обновлении приложения или нет?

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

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

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