2013-04-25 18 views
10

Con una mia app, ho avuto un problema con uno dei miei corsi Serialized quando provo ad aggiornare il mio APK.Serializzazione/Deserializzazione e Proguard

In effetti, c'erano problemi relativi agli oggetti salvati con la versione precedente dell'apk e la nuova versione dell'apk.

Nell'ultima APK (in produzione su Android Market), ho dimenticato di configurare il mio proguard.cfg per la classe Serializable (e quindi la loro statica serialVersionUID lungo finale membro) ...

Così, quando io cerco nel mio nuovo APK per ricaricare questo precedente classe Serializable immagazzinata, ho un InvalidClassException problema nel 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) 

so che era un problema di offuscamento con oggetti Serializable e la loro serialVersionUID ...

Dopo aver letto Proguard and Serialized Java Objects qui che si espongono in modo chiaro il mio problema, io non sono in grado di risolvere il mio problema ...

Nel mio prossimo APK ho aggiungere questo nel mio 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(); 
}

per evitare il problema per i prossimi aggiornamenti, il mio ho davvero bisogno di tornare questi vecchi oggetti ...

ho provare a cambiare la serialVersionUID con 6593847879518920343L o 0L, senza successo ...

Qualche idea?

Grazie in anticipo per le vostre risposte!

risposta

5

Si potrebbe provare questo:

  1. Calcolare i serialVersionUIDs del offuscati classi serializzabili e aggiungerli al codice sorgente di corrente.
  2. Obfuscate il nuovo codice, preservando i serialVersionUIDs, ma assicurandovi anche che le classi serializzabili siano mappate ai nomi offuscati in precedenza (con l'opzione -applymapping).
+0

Hai ragione! Tu salvi il mio weekend! :) – StephaneT

+7

Come calcolare gli IDVersione seriale delle classi serializzabili offuscate? – peceps

+1

Questa risposta manca di codice di esempio su come ottenere le soluzioni – McFarlane