10

私のアプリの 1 つで、APK を更新しようとすると、シリアライズされたクラスの 1 つで問題が発生しました。

実際、以前のバージョンの apk と新しいバージョンの apk で保存されたオブジェクトに関連する問題がありました。

最新の APK (Android マーケットでの運用中) では、proguard.cfg を Serializable クラス (およびその静的な最終的な長い serialVersionUIDメンバー)用に構成するのを忘れていました...

したがって、新しい APK でこの以前に保存された Serializable クラスをリロードしようとすると、 StackTrace DDMS でInvalidClassException問題が発生します。

04-24 18:17:40.120: W/System.err(1204): java.io.InvalidClassException: cu; Incompatible class (SUID): cu: static final long serialVersionUID =6593847879518920343L; but expected cu: static final long serialVersionUID =0L;
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2380)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1662)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)

Serializable オブジェクトとその serialVersionUID の難読化の問題であることはわかっています...

ここでProguard and Serialized Java Objectsを読んだ後、私の問題が明らかになりましたが、問題を解決できません...

次の APK では、これを proguard.cfg に追加しました。

-keepnames class * implements java.io.Serializable

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient ;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

次の更新の問題を回避するには、これらの古いオブジェクトを取り戻す必要があります...

serialVersionUID を 6593847879518920343L または 0L に変更しようとしましたが、成功しませんでした...

何か案が ?

ご回答ありがとうございます。

4

1 に答える 1

5

これを試すことができます:

  1. 難読化されたシリアライズ可能クラスの serialVersionUID を計算し、それらを現在のソース コードに追加します。
  2. 新しいコードを難読化し、serialVersionUID を保持しますが、シリアル化可能なクラスが以前の難読化された名前にマップされていることも確認します (オプション -applymapping を使用)。
于 2013-04-26T00:23:35.047 に答える