2013-03-18 22 views
53

Mam swoją klasę ClassMultiPoint z podklasami.Zapobieganie obfuskacji nazwy elementu klasy przez 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; 
     } 
    } 
} 

otrzymam wartość przedmiotu oPoints z parse GSON:

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

próbuję użyć oPoints.message.

Po uruchomieniu aplikacji bez aplikacji proguard uruchamianie aplikacji. Gdy uruchomię swoją aplikację z proguard awarią mojej aplikacji.

Myślę, że problem: proguard zmień nazwę atrybutu 'oPoints.message' z mojej klasy na krótką 'a'.

próbuję zachować nazwy metod i atrybutów jest stała, ale proguard zmień jej:

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

Jaki jest właściwy sposób, aby zachować nazwy metod i atrybutów moim jednym (statyczna) klasa?

Odpowiedz

22

Dzięki Waqas!

znajdę rozwiązanie dla mojego przypadku:

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

Również nie korzystają @SerializedName("message") w mojej klasie, aboved praca config dobrze bez serializacji.

+0

Użyłem powyższego kodu, ale nie zadziałało to dla mnie –

+0

@iDroid Explorer Używam apkTool do testowania wydania apk ale zaciemnianie nie działa dla mnie to nie zmieniło nazw klas –

+0

Te ustawienia NIE umniejszają kodu. Czy potrzebujesz zaciemnić kod? –

53

Jeśli nie chcesz, aby członkowie twojej klasy byli zaciemniani, użyj adnotacji dostarczonej przez Gson. Na przykład:

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

    ... 

} 

Co więcej, upewnij się, że dodasz również odpowiednią konfigurację proguard dla biblioteki Gson. Na przykład:

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

Aby uzyskać więcej informacji, przeczytaj this.

+1

-Trzymaj klasy com.google.gson.examples.android.model. * * {*; } to działa dla mnie, ale kiedy zastosowałem reverse engg na apk, mam wszystkie klasy modeli z niezmienioną składową, łamie cel bezpieczeństwa, czy nie ma innej opcji, możemy też zaciemnić model? – umesh

+5

używasz adnotacji '@ SerializedName' na swoich członkach? ponieważ jeśli to zrobisz, nie musisz ominąć obfuskacji klasy niestandardowej w konfiguracji proguard, tak jak robisz to w 'com.google.gson.examples.android.model. ** {*; } '. – waqaslam

+0

nie, właściwie chciałem to zaciemnić. ale teraz zdałem sobie sprawę, że jeśli nazwy pól się zmienią, to nie będą pasować do klucza json, więc gson nie mógł go sparsować. – umesh

18

Podczas korzystania z opcji optymalizacji Dexguard również znalazłem, że muszę -keepclassmembers. Bez tego kilka moich modeli obiektów nie 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

Jeśli używasz @Expose adnotacji jak to zrobić, można powiedzieć ProGuard utrzymać żadnego pola uwagami z nim:

# 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

Działa to również dla SerializedName. –

2

Aby wykluczyć swoją klasę od zaciemniania, Zachowaj atrybuty InnerClasses, zachowaj swoją klasę i zachowaj członków klasy np..

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

Aby uzyskać więcej informacji http://proguard.sourceforge.net/manual/examples.html

1

Jest wbudowany @Keep adnotacji, które wykorzystać można znaleźć ten link

Powiązane problemy