Предотrotation запутывания имени члена classа ProGuard

У меня есть class ClassMultiPoint с подclassами.

 public class ClassMultiPoints { public String message; public List data; public class ClassPoints { public String id; public List points; public class ClassPoint { public String speed; public String bearing; } } } 

Я получаю значение объекта oPoints от parsingа GSON :

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

Я пытаюсь использовать oPoints.message .

Когда я запускаю приложение без приложения proguard , запустите его. Когда я запускаю свое приложение с proguard мое приложение падает.

Я думаю, проблема заключается в следующем: proguard переименует атрибут 'oPoints.message' моего classа на короткий '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 (android.content.Context); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (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 ; } 

Каков правильный способ сохранить имена методов и атрибутов моего (статического) classа?

Если вы не хотите, чтобы ваши члены classа были запутаны, используйте аннотацию SerializedName предоставленную Gson. Например:

 public class ClassMultiPoints { @SerializedName("message") public String message; @SerializedName("data") public List 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") в своем classе, а команда 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 * 

Чтобы исключить ваш class из обфускации, сохраните атрибуты InnerClasses, сохраните свой class и сохраните class classа classа, например.

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

Для получения дополнительной информации http://proguard.sourceforge.net/manual/examples.html

Существует встроенная аннотация @Keep которую вы используете, пожалуйста, перейдите по этой ссылке

  • Как получить текущее местоположение в Android
  • Android FTP Library
  • Как создать кнопку динамически в android?
  • NullPointerException - доступ к представлениям в onCreate ()
  • отображение AM и PM в маленькой букве после форматирования даты
  • Отображение целого числа на тосте
  • Как правильно переопределить toString () на Java?
  • Изменение библиотеки OpenSSL в приложении Android для HttpClient
  • Есть ли способ в Java преобразовать целое число в его порядковый номер?
  • В чем разница между JDK и JRE?
  • Элемент списка избранных элементов Android ListView выделен
  • Давайте будем гением компьютера.