2013-05-18 8 views
9

All'avvio la mia app registra due errori, ma solo dopo l'offuscamento. Senza offuscamento non ci sono errori.Risultati di offuscamento Proguard in java.lang.IllegalArgumentException: class dichiara più campi JSON denominati "a"

Se non mi siano indotti in errore, gli errori sono come:

Classe di resistenza dichiara più campi denominati JSON un

e lo stesso per la classe PropertyDefinition.

05/18 03:33:19.465 java.lang.IllegalArgumentException: class PropertyDefinition declares multiple JSON fields named a: 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
com.google.gson.Gson.getAdapter(Gson.java:349) 
com.google.gson.Gson.toJson(Gson.java:574) 
com.google.gson.Gson.toJson(Gson.java:561) 
com.google.gson.Gson.toJson(Gson.java:516) 
com.google.gson.Gson.toJson(Gson.java:496) 
Property.a(SourceFile:210) <see comment in code below noting this code line> 
Property.a(SourceFile:68) 
bj.a(SourceFile:44) 
aA.<init>(SourceFile:339) 

05/18 03:33:19.479 java.lang.IllegalArgumentException: class Property declares multiple JSON fields named a: 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122) 
com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
com.google.gson.Gson.getAdapter(Gson.java:349) 
com.google.gson.Gson.fromJson(Gson.java:790) 
com.google.gson.Gson.fromJson(Gson.java:757) 
com.google.gson.Gson.fromJson(Gson.java:706) 
com.google.gson.Gson.fromJson(Gson.java:678) 
Property.a(SourceFile:75) <see comment in code below noting this code line> 
bj.a(SourceFile:44) 
aA.<init>(SourceFile:339) 

Questa è la sezione della mappa di offuscamento relativa a uno degli errori quasi identici. Ho nascosto il nome della classe "Proprietà" qui e sopra. Non vedo il problema Non ho ulteriori esperienze con l'offuscamento quindi non so cosa cercare.

mypackage.Property: 
    mypackage.PropertyDefinition rootElement -> a 
    java.util.HashMap indexById -> a 
    java.util.HashMap indexByKey -> b 
    long nntgID -> a 
    43:54:boolean equals(java.lang.Object) -> equals 
    60:64:int hashCode() -> hashCode 
    68:84:boolean check() -> a 
    88:88:java.lang.String getFileName() -> a 
    92:92:java.lang.String getDirectory() -> b 
    101:102:java.lang.String getVersion() -> c 
    107:107:java.util.HashMap getIdIndex() -> a 
    112:112:java.util.HashMap getKeyIndex() -> b 
    122:122:long getNntgID() -> a 
    126:127:void setNntgID(long) -> a 
    142:147:void setRootElement(mypackage.PropertyDefinition) -> a 
    150:150:mypackage.PropertyDefinition getPropertyDefinitionById(java.lang.String) -> a 
    154:154:mypackage.PropertyDefinition getPropertyDefinitionByKey(java.lang.String) -> b 
    162:168:java.lang.String toString() -> toString 
    210:214:void toFile() -> a 

BTW, ho questa sezione nel mio config Proguard già:

-keep class com.google.gson** { *; } 
-keepclassmembers class com.google.gson** { 
    *; 
} 

Tutti i suggerimenti su dove cominciare la risoluzione dei problemi?

+0

Hai provato a non offuscare (mantenere) 'Property' e' PropertyDefinition'? –

+0

@JoeF Ho finito per farlo la scorsa notte: '-keep public class myPackage.PropertyDefinition {*; } 'e molti altri. Questo lo risolve, ma pensavo/speravo di poter mantenere il nome della classe (ad esempio, 'PropertyDefinition') senza mantenere tutti i nomi dei membri. Finora non riesco a farlo funzionare. – MountainX

risposta

6

Sembra che stiate specificando l'opzione ProGuard -overloadaggressively nel proguard-project.txt. Sovrascrive i nomi dei campi e i nomi dei metodi con gli stessi nomi offuscati, ad es. 'a', purché le firme dei campi e dei metodi siano differenti. È valido per i file di classe, ma a GSON chiaramente non piace, quindi dovresti evitare l'opzione.

+1

La cosa divertente è che '-overloadaggressively' è una delle opzioni raccomandate in vari esempi di Proguard per configurare GSON. – MountainX

+2

L'opzione è ok se la si combina anche con le opzioni -keep per conservare i campi serializzati con i loro nomi originali. Ciò evita anche qualsiasi scontro sul nome. –

+0

non funziona per me – xedo

3

La ragione per cui il solo mantenimento del nome della classe senza preservare i nomi dei membri non funziona è perché i nomi dei membri sono ciò che causa l'errore. Proguard sta rinominando più membri con lo stesso nome 'a', che è perfettamente valido nei file di classe. Tuttavia, lo strumento che stai utilizzando non ha l'impressione di avere più membri con lo stesso nome, quindi genera un errore.

La soluzione è quindi impedire a Proguard di rinominare i membri di quella classe. Probabilmente c'è anche un'impostazione Proguard per evitare nomi duplicati, ma non ho abbastanza familiarità per dire di cosa si tratta.

+1

Questa risposta mi ha indirizzato verso la giusta direzione. Ho aggiunto '-keep class your.package.name.model. ** {*;}' come [suggerito qui] (https://bitbucket.org/littlerobots/cupboard/wiki/ProGuard). – Sufian