2013-04-25 11 views
10

Với một trong các ứng dụng của tôi, tôi đã gặp sự cố với một trong các lớp được sắp xếp theo thứ tự của mình khi cố gắng cập nhật APK của mình.Serialization/Deserialization & Proguard

Thật vậy, đã xảy ra sự cố liên quan đến các đối tượng được lưu với phiên bản trước của gói ứng dụng và phiên bản mới của gói ứng dụng.

Trong apk mới nhất (trong sản xuất trên Android Market), tôi đã quên để cấu hình proguard.cfg tôi cho lớp Serializable (và do đó họ static final serialVersionUID dài thành viên) ...

Vì vậy, khi tôi cố gắng trong aPK mới của tôi để lại được lưu trữ lớp Serializable trước đây, tôi đã là một InvalidClassException vấn đề trong stackTrace DDMS:

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) 

tôi biết đó là một vấn đề gây rối với các đối tượng Serializable và serialVersionUID của họ ...

Sau khi đọc Proguard and Serialized Java Objects đây được phơi bày rõ ràng vấn đề của tôi, tôi không thể giải quyết vấn đề của tôi ...

Trong APK tiếp theo của tôi, tôi đã thêm này trong proguard.cfg tôi:

-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(); 
}

để tránh những vấn đề đối với bản cập nhật tiếp theo, tôi thực sự cần phải có được trở lại các đối tượng cũ ...

tôi đã cố gắng thay đổi serialVersionUID với 6593847879518920343L hoặc 0l, không thành công ...

Bất kỳ ý tưởng nào?

Cảm ơn trước vì câu trả lời của bạn!

Trả lời

5

Bạn có thể thử này:

  1. Tính serialVersionUIDs của obfuscated lớp serializable và thêm chúng vào các mã nguồn hiện nay.
  2. Làm xáo trộn mã mới, bảo toàn serialVersionUID, nhưng cũng đảm bảo rằng các lớp serializable được ánh xạ tới các tên bị xáo trộn trước đó (với tùy chọn -applymapping).
+0

Bạn nói đúng! Bạn tiết kiệm cuối tuần của tôi! :) – StephaneT

+7

Làm thế nào để tính toán serialVersionUIDs của các lớp serializable obfuscated? – peceps

+1

Câu trả lời này thiếu mã ví dụ về cách đạt được các giải pháp – McFarlane