Home » Android » ProGuard for Android and Retrofit2 Converter Gson?

ProGuard for Android and Retrofit2 Converter Gson?

Posted by: admin May 14, 2020 Leave a comment


i am using ProGuard in my project but its giving wrong data in new Gson().toJson(Request);

i am getting out put


instead of


My ProGuard rule

-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
-dontwarn sun.misc.Unsafe
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclassmembers class rx.internal.util.unsafe.** {
    long producerIndex;
    long consumerIndex;

-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
-keep class com.google.gson.** { *; }
-keep class com.google.inject.** { *; }

and i am using

 compile 'com.squareup.retrofit2:converter-gson:2.0.0'

is there a new recommended ProGuard configuration for retrofit2:converter-gson in Android?

How to&Answers:

you either want to keep the class you are using with gson or use @SerializedName annotation.

option 1 (keep class)

// all classes in a package
-keep class com.example.app.json.** { *; }
// or a specific class
-keep class com.example.app.json.SpecificClass { *; }

option 2 (use @SerializedName):

public class YourJsonClass{
   @SerializedName("name") String username;

   public MyClass(String username) {
     this.username = username;

with the second option proguard still obfuscates the class and field names but gosn can use the annotation to get the correct name for each field


Annotate your JSON model classes with @Keep.


Use android @Keep annotation on you desired class like authToken

data class AuthToken(
    var access_token: String,
    var token_type: String,
    var expires_in: String,
    var userName: String,
    var issued: String,
    var expires: String) {}

And then in ProGuard add below line:
If using androidx

-keep @androidx.annotation.Keep public class *


 -keep @android.support.annotation.Keep public class *


In my case, I was using Moshi for JSON with Retrofit, but the problem was the same. It worked in debug, but after building with ProGuard, the RecyclerView that used the model crashed with a NullPointerException, because the list was full of empty model objects, since Moshi didn’t recognize any of the fields. I think the exact same thing happens with Gson.

One solution is to annotate every field with its corresponding serialized name:

@Json(name="username") String username;

That way ProGuard can obfuscate the variable names without breaking the conversion.

The other solution is adding a “keep” option like Dodge suggested, in the proguard-rules.pro file

-keep public class com.example.model.User