2013-03-18 18 views
53

Ho la mia classe ClassMultiPoint con sottoclassi.Prevenire l'offuscamento del nome della classe da parte di ProGuard

public class ClassMultiPoints 
{ 
    public String message; 
    public List<ClassPoints> data; 

    public class ClassPoints 
    { 
     public String id; 
     public List<ClassPoint> points; 
     public class ClassPoint 
     { 
     public String speed; 
     public String bearing; 
     } 
    } 
} 

mi metterò il valore dell'oggetto oPoints da parse GSON:

oPoints = gson.fromJson(jsonString, ClassMultiPoints.class);

provo usare oPoints.message.

Quando si esegue la mia applicazione senza successo di esecuzione di app proguard. Quando eseguo la mia app con proguard l'arresto anomalo dell'app.

Penso che il problema sia: proguard attributo di rinomina 'oPoints.message' della mia classe a breve 'a'.

provo mantenere i nomi dei metodi e degli attributi è costante, ma proguard rinominare la sua:

proguard.cfg:

-injars  bin/classes 
-injars  libs 
-outjars  bin/classes-processed.jar 
-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-optimizations !code/simplification/arithmetic 
-keepattributes *Annotation* 
-dontskipnonpubliclibraryclasses 
-optimizationpasses 5 
-printmapping map.txt 
-flattenpackagehierarchy 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.MapActivity 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 

-libraryjars libs/commons-io-2.2.jar 
-libraryjars libs/ftp4j-1.7.1.jar 
-libraryjars libs/gson-2.2.2.jar 

-keep public class org.apache.commons.io.** 
-keep public class it.sauronsoftware.ftp4j.** 
-keep public class com.google.gson.** 

-keep public class com.mypackagename.ActivityMonitor$* 

-keep public class * extends android.view.View { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    public void set*(...); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.content.Context { 
    public void *(android.view.View); 
    public void *(android.view.MenuItem); 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    static android.os.Parcelable$Creator CREATOR; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

Qual è il modo giusto per mantenere i nomi dei metodi e attributi del My One (statico) di classe?

risposta

22

Grazie Waqas!

trovo soluzione per il mio caso:

-optimizationpasses 5 
-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging*/ 
-allowaccessmodification 
-repackageclasses '' 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.MapActivity 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 

-libraryjars libs/commons-io-2.2.jar 
-libraryjars libs/gson-2.2.2.jar 
-keep public class org.apache.commons.io.** 
-keep public class com.google.gson.** 
-keep public class com.google.gson.** {public private protected *;} 

##---------------Begin: proguard configuration for Gson ---------- 
-keepattributes *Annotation*,Signature 
-keep class com.mypackage.ActivityMonitor.ClassMultiPoints.** { *; } 
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints  { public protected *; } 
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints { public protected *; } 
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints$ClassPoint { public protected *; } 
# To support Enum type of class members 
-keepclassmembers enum * { *; } 
##---------------End: proguard configuration for Gson ---------- 

Anche io non uso @SerializedName("message") nella mia classe, aboved lavoro config bene senza serializzazione.

+0

Ho usato il codice sopra ma non ha funzionato per me –

+0

@iDroid Explorer Io uso apkTool per testare l'apk di rilascio ma l'offuscamento non ha funzionato per me non ha rinominato le classi –

+0

Queste impostazioni consentono di NON offuscare il codice. Hai bisogno di codice offuscato? –

53

Se non si desidera che i membri della classe vengano offuscati, utilizzare l'annotazione SerializedName fornita da Gson. Ad esempio:

public class ClassMultiPoints 
{ 
    @SerializedName("message") 
    public String message; 
    @SerializedName("data") 
    public List<ClassPoints> data; 

    ... 

} 

Inoltre, assicurarsi di aggiungere anche la corretta configurazione di proguard per la libreria Gson. Ad esempio:

##---------------Begin: proguard configuration for Gson ---------- 
# Gson uses generic type information stored in a class file when working with 
#fields. Proguard removes such information by default, so configure it to keep 
#all of it. 
-keepattributes Signature 

# For using GSON @Expose annotation 
-keepattributes *Annotation* 

# Gson specific classes 
-keep class sun.misc.Unsafe { *; } 
#-keep class com.google.gson.stream.** { *; } 

# Application classes that will be serialized/deserialized over Gson 
-keep class com.google.gson.examples.android.model.** { *; } 

##---------------End: proguard configuration for Gson ---------- 

Per ulteriori informazioni leggere this.

+1

-keep classe com.google.gson.examples.android.model. * * {*; } Funziona per me ma quando ho applicato reverse engg su apk, ho ottenuto tutte le classi del modello con i membri non modificati, si rompe lo scopo di sicurezza, non c'è qualche altra opzione, possiamo offuscare anche il modello? – umesh

+5

stai usando l'annotazione '@ SerializedName' in cima ai membri della tua classe? perché, se lo fai, non devi bypassare l'offuscamento della classe personalizzata in proguard config come fai con 'com.google.gson.examples.android.model. ** {*; } '. – waqaslam

+0

no, in realtà volevo offuscarlo. ma ora mi sono reso conto che se i nomi dei campi cambiano, allora non corrisponderanno alla chiave json, quindi il gson non potrebbe analizzarlo. – umesh

18

Ho anche trovato che ho bisogno di -keepclassmembers quando si utilizza l'opzione di ottimizzazione di Dexguard. Senza questo molti dei miei oggetti del modello non è riuscito a deserialise

##---------------Begin: proguard configuration for Gson ---------- 
# Gson uses generic type information stored in a class file when working with fields. Proguard 
# removes such information by default, so configure it to keep all of it. 
-keepattributes Signature 

# For using GSON @Expose annotation 
-keepattributes *Annotation* 

# Application classes that will be serialized/deserialized over Gson, keepclassmembers 
-keep class com.myapp.model.** { *; } 
-keepclassmembers class com.myapp.model.** { *; } 
4

Se si utilizza il @Expose annotazione come faccio io, si può dire ProGuard per mantenere qualsiasi campo annotato con esso:

# keep anything annotated with @Expose 
-keepclassmembers public class * { 
    @com.google.gson.annotations.Expose *; 
} 
# Also keep classes that @Expose everything 
-keep @com.google.gson.annotations.Expose public class * 
+0

Questo funziona anche per SerializedName. –

2

Per escludere la classe dall'offuscamento, mantieni gli attributi di InnerClass, mantieni la tua classe e mantieni i membri della classe della classe es.

-keepattributes InnerClasses 
-keep class com.yourproject.YourClass** 
-keepclassmembers class com.yourproject.YourClass** { 
    *; 
} 

Per ulteriori informazioni http://proguard.sourceforge.net/manual/examples.html

1

V'è un built-in @Keep annotazione che si utilizza, consulta questo link

Problemi correlati