Prevent class member name obfuscation by ProGuard
If you dont want your class members to be obfuscated then use SerializedName
annotation provided by Gson. For example:
public class ClassMultiPoints{ @SerializedName("message") public String message; @SerializedName("data") public List<ClassPoints> data; ...}
Moreover, make sure you do add proper proguard configuration for Gson library too. For example:
##---------------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 ----------
For more info read this.
Thanks Waqas!
I find solution for my case:
-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 ----------
Also I don't use @SerializedName("message")
in my class, aboved config work fine without serialization.
I also found I need to -keepclassmembers
when using Dexguard's optimise option. Without this several of my model objects failed to 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.** { *; }