Предот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 которую вы используете, пожалуйста, перейдите по этой ссылке

  • Код будет возвращать 0.0, 0.0 GPS-координату при бросании NullPointerException
  • Неподдерживаемая версия major.minor 52.0 в моем приложении
  • SQlite Получение ближайших мест (с широтой и долготой)
  • remove () в списке, созданном с помощью Arrays.asList () throws UnsupportedOperationException
  • Почему имена переменных часто начинаются с буквы «m»?
  • Что именно влияет на URLConnection.setDoOutput ()?
  • Android для выбора цвета для включения в активность
  • java.lang.ClassCastException
  • Android: Есть ли способ изменить язык по умолчанию для Android на новый язык?
  • Как запросить веб-сервис через запрос POST в Android?
  • Настройка spinner onClickListener () в Android
  • Interesting Posts

    Ошибка WPF 40 Ошибка BindingExpression path: свойство не найдено в ‘объекте’

    Windows 8 сообщает о безотказной работе (возможно, в режиме полного времени гибридной загрузки)

    При выборе репозитория Android SDK Manager дает ошибку «Ошибка при получении URL https://dl-ssl.google.com/android/repository/repository.xml»

    Оффлайн-возможности Firebase и addListenerForSingleValueEvent

    Не удается установить Windows 7 на расширенный раздел

    Выход JFrame на закрытии Java

    C ++: Поймать деление на нулевую ошибку

    Поиск в панели управления Windows потеряет фокус после ввода одного символа

    Могу ли я установить Windows 7 x64 на MacBook Air?

    CSV на лист Excel снова

    ImportError на python 3, отлично работал на python 2.7

    Android NDK учебник / руководство для начинающих.

    Почему я не могу определить функцию внутри другой функции?

    Изменить статус по умолчанию Magento для дублированных продуктов

    Существует ли адаптер HDMI-to-DVI (двухканальный)? Меня не волнует цена

    Давайте будем гением компьютера.