2013-03-18 8 views
53

Ich habe meine Klasse ClassMultiPoint mit Unterklassen.Verhindern Klassenname Verschleierung durch 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; 
     } 
    } 
} 

werde ich Wert von Objekt oPoints von Parse GSON erhalten:

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

Ich versuche oPoints.message zu verwenden.

Wenn ich meine Anwendung ohne proguard App laufen ausführen. Wenn ich meine App mit proguard meine App abstürzen.

Ich denke, Problem ist: proguard Umbenennen Attribut 'oPoints.message' meiner Klasse zu kurz 'a'.

Ich halte versuchen, die Namen der Methoden und Attribute konstant ist, sondern proguard umbenennen seine:

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

Was richtiger Weg ist, Namen der Methoden und Attribute der mein eines halten (statische) Klasse?

Antwort

22

Danke Waqas!

Ich finde Lösung für meinen Fall:

-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 ---------- 

Auch verwende ich nicht @SerializedName("message") in meiner Klasse, aboved Config funktionieren ohne Serialisierung.

+0

Ich habe den obigen Code, aber es hat nicht funktioniert für mich –

+0

@iDroid Explorer Ich benutze apkTool, um die Freigabe apk zu testen, aber Verschleierung funktionierte nicht für mich, es nicht umbenannt die Klassen –

+0

Diese Einstellungen erlauben NICHT, den Code zu verschleiern. Benötigen Sie einen verschleierten Code? –

53

Wenn Sie nicht möchten, dass Ihre Klassenmitglieder verschleiert werden, verwenden Sie die von Gson zur Verfügung gestellte Anmerkung SerializedName. Zum Beispiel:

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

    ... 

} 

Darüber hinaus stellen Sie sicher, dass Sie auch die richtige proguard Konfiguration für Gson-Bibliothek hinzufügen. Zum Beispiel:

##---------------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 ---------- 

Für weitere Informationen lesen Sie this.

+1

-keep Klasse com.google.gson.examples.android.model beziehen. * * {*; } es funktioniert für mich, aber wenn ich reverse engg auf apk anwendete, bekam ich alle Modellklassen mit nicht Änderung in den Mitgliedern, es bricht den Sicherheitszweck, gibt es keine andere Wahl, können wir Modell auch verschleiern? – umesh

+5

verwenden Sie die Annotation "@ SerializedName" über Ihren Klassenmitgliedern? Wenn Sie das tun, müssen Sie die benutzerdefinierte Klassenverschleierung in der proguard-Konfiguration nicht umgehen, wie Sie es mit 'com.google.gson.examples.android.model tun. ** {*; } '. – waqaslam

+0

nein, eigentlich wollte ich es verschleiern. aber jetzt erkannte ich, dass wenn sich die Feldnamen ändern, sie nicht mit dem JSON-Schlüssel übereinstimmen, also konnte der GSON ihn nicht analysieren. – umesh

18

Ich fand auch, dass ich -keepclassmembers bei der Verwendung der Optimierungsoption von Dexguard brauche. Ohne diese mehrere Objekte meines Modells

##---------------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

Wenn Sie die @Expose Anmerkung verwenden, um deserialise gescheitert, wie ich, können Sie ProGuard sagen jedes Feld mit ihm kommentierten zu halten:

# 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

Dies funktioniert auch für SerializedName. –

2

Klasse auszuschließen von Obfuscation, Behalte die Attribute von InnerClasses, behalte deine Klasse und behalte die Klassenmitglieder der Klasse zB.

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

Weitere Informationen http://proguard.sourceforge.net/manual/examples.html

1

Es gibt eine eingebaute in @Keep Anmerkung, die Sie verwenden, benutzen Sie bitte diese link

Verwandte Themen