Предотвратить обфускацию имени члена класса с помощью ProGuard
У меня есть свой класс ClassMultiPoint
с подклассами.
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;
}
}
}
Я получу значение объекта oPoints
из parse GSON
:
oPoints = gson.fromJson( jsonString, ClassMultiPoints.class);
Я пытаюсь использовать oPoints.message
.
Когда я запускаю свое приложение без proguard
успешного запуска приложения.
Когда я запускаю свое приложение с proguard
, мое приложение падает.
Я думаю, что проблема заключается в следующем: proguard
переименуйте атрибут 'oPoints.message'
моего класса в short 'a'
.
Я стараюсь держать имена методов и атрибутов постоянными, но proguard
переименовать его:
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>;
}
Как правильно хранить имена методов и атрибутов класса my one (static)?
6 ответов:
Если вы не хотите, чтобы ваши члены класса были запутаны, используйте аннотацию
SerializedName
, предоставленную Gson. Например:public class ClassMultiPoints { @SerializedName("message") public String message; @SerializedName("data") public List<ClassPoints> data; ... }
Кроме того, убедитесь, что вы добавляете правильную конфигурацию proguard для библиотеки Gson. Например:
##---------------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 ----------
Для получения дополнительной информации прочитайте это.
Спасибо Вакас!
Я нахожу решение для своего случая:
-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 ----------
Также я не использую
@SerializedName("message")
в своем классе, aboved config прекрасно работает без сериализации.
Я также обнаружил, что мне нужно
-keepclassmembers
при использовании опции оптимизации Dexguard. Без этого несколько объектов моей модели не смогли десериализоваться##---------------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.** { *; }
Если вы используете аннотацию
@Expose
, Как я, Вы можете сказать ProGuard, чтобы любое поле было аннотировано ею:# 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 *
Чтобы исключить свой класс из обфускации, сохраните атрибуты InnerClasses, сохраните свой класс и сохраните членов класса eg.
-keepattributes InnerClasses -keep class com.yourproject.YourClass** -keepclassmembers class com.yourproject.YourClass** { *; }
Для получения дополнительной информации http://proguard.sourceforge.net/manual/examples.html
Есть встроенная
@Keep
аннотация, которую вы используете, пожалуйста, обратитесь к этой ссылке