Предот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);
- R.raw.any не может быть разрешено
- Трансляция, когда состояние сети изменилось
- Как добавить параметры в HTTP GET-запрос в Android?
- android MapView в fragmentе
- Запретить отображение клавиатуры при запуске
Я пытаюсь использовать 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а?
- Путь к ресурсу в нашей папке war / WEB-INF?
- Использование неинициализированного конечного поля - с / без "этого". спецификатор
- Как показать эллипсы в моем TextView, если он больше, чем 1 строка?
- Android Geocoder getFromLocationName всегда возвращает null
- Theme.AppCompat.Light.DarkActionBar - Ресурс не найден
- java.io.StreamCorruptedException: недопустимый заголовок streamа: 54657374
- Что вы не можете сделать на VM Dalvik (виртуальная машина Android), которую вы можете использовать в Sun VM?
- SimpleXML выбрасывает XmlPullParserException, unterminited entity ref без причины
Если вы не хотите, чтобы ваши члены 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
которую вы используете, пожалуйста, перейдите по этой ссылке