2015-09-14 11 views
10

アクティビティのinstanceStateには、シリアライズ可能(bundle.putSerializable)が格納されています。アプリのアップグレード中にAndroidアクティビティのインスタンス状態が消去されていますか?

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で難読化されています。私たちは次のスタックトレースを見てPlayストアからのクラッシュレポートで 。 Androidはクラスをシリアル化できますが、クラスを逆シリアル化できないようです。

私たちが現在考えることのできる唯一の理由は、(Playストア経由で)アプリのアップグレードです。バージョン間でクラスが変更され(デクスガードのため)、逆シリアル化が不可能になります。

私の質問は、アプリケーションのアップグレード中にAndroidがすべてのinstanceStateをクリーンアップするかどうかです。

+0

アプリは、特別な種類の「意図」を処理しますか?内部の 'サービス 'を呼び出すか提供するか? – JimmyB

+0

はい、バンドルパラメータを持つIntentで開始された内部サービスがあります。しかし、私が上で説明した問題は、アクティビティ内の問題です。 – userM1433372

+0

答えにコメントがありますか? –

答えて

1

保存されたインスタンス状態にカスタムクラスを含めないでください。これらのクラスが変更される可能性がある場合(DexGuardだけで名前をシャッフルしていても)です。システムは最近の活動に関するいくつかの情報を保持しており、アップグレード全体で再利用しようとする可能性があります。

+0

これはあなたの経験ですか、それともドキュメントでこれを見つけましたか? – userM1433372

+0

したがって、独自のクラスでインテントパラメータバンドルにputSerializable()を使用しないでください。 – userM1433372

+0

"これらのクラスが変更される可能性がある場合は"。アプリの外部APIのように考えてください。変更すると、アプリが破損する可能性があります。 私はそれを内部リソースで見つけましたが、私は公的な文書がこの状況を具体的に呼び出すとは思わない。 –

1

私が知る限り、システムが完全に破壊されたときにアクティビティの状態を復元する唯一の条件は、システムメモリを回復するためにシステムがそのアクティビティを破壊しなければならない場合です。他のすべての場合(停止する強制的なプロセス、アプリケーションの再インストール、デバイスの再起動)には、状態は失われます。

再インストールについては、新しいバージョンのアプリケーションをインストールするときに、おそらく1つ以上のアクティビティを変更または削除したことと、古いアクティビティの状態が新しいものの状態と一致しない可能性があることを考慮する必要があります。たとえば、単一のアクティビティアプリケーションで、 "@ + id/my_text"というIDを持つTextViewがあるとします。数日後、TextViewを削除し、ID「my_text」を別のビューに割り当てます。たとえばSpinner:システムはSpinnerのTextViewのテキストをどのように復元できますか?

関連する問題