androidproguardandroid-proguard

Error using proguard Retrofit2 and GSON Converter


I'm creating a native android app and I want to release it.

I'm using retrofit and Gson converter. Also a search view. For the release I have set up the proguard rules, as suggested by retrofit:

# Add project specific ProGuard rules here.
-dontwarn javax.**
-keep class android.support.v7.widget.SearchView { *; }

# Retrofit
-dontwarn okhttp3.**
-dontwarn okio.**
# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions

In retrofit I use: ApiUtils.java

 public static PBTService getPBTService(String BASE_URL) {
        return RetrofitClient.getClient(BASE_URL).create(PBTService.class);
    }

Service.java

import br.com.adley.ipubg.data.Player;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.Path;

public interface PBTService {
    String API_KEY = "MYKEY";
    @Headers(API_KEY)
    @GET("profile/pc/{nickname}")
    Call<Player> getPlayerStatsByNickname(@Path("nickname") String nickname);

}

RetrofitClient.java

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {

    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }

        return retrofit;
    }
}

In debug mode or when proguard is offline it works perfectly. But when I generate signed app with proguard and do a GET using retrofit, I get the following error:

java.lang.IllegalArgumentException: Unable to create converter for class br.com.adley.ipubg.a.a for method a.a

I've try a lot of proguard configs. I might think the error is related with GSON converter.

I've already tried:

#My retrofit service package
-keep public class br.com.adley.ipubg.data.** {public private protected *;}
-keep public class br.com.adley.ipubg.activities.MainActivity.** {public private protected *;}
#others configs
-keep class com.google.gson.** { ; }
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }:
-keep public class com.google.gson.**
-keep public class com.google.gson.** {public private protected *;}

UPDATE

I've add the GSON configs to pro-guard:

##---------------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
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class br.com.adley.ipubg.data.models.MatchHistory.** { *; }
-keep class br.com.adley.ipubg.data.models.Player.** { *; }
-keep class br.com.adley.ipubg.data.models.Season.** { *; }
-keep class br.com.adley.ipubg.data.models.Stats.** { *; }

# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

##---------------End: proguard configuration for Gson  ----------

But still get an error:

java.lang.IllegalArgumentException: Unable to create converter for class br.com.adley.ipubg.data.models.Player for method a.a

Solution

  • After check the comments, I've add a GSON proguard rules and retrofit.

    Also, be careful if you have a wrapper that uses your models, it will cause convert errors.

    My final pro-guard rules, now working, is:

    # Add project specific ProGuard rules here.
    -assumenosideeffects class android.util.Log {
        public static boolean isLoggable(java.lang.String, int);
        public static int v(...);
        public static int i(...);
        public static int w(...);
        public static int d(...);
        public static int e(...);
    }
    
    -dontwarn org.ini4j.** # Ignore warning for missing classes in ini4j
    -dontwarn javax.**
    -keep class android.support.v7.widget.SearchView { *; }
    
    # Retrofit
    -dontwarn okhttp3.**
    -dontwarn okio.**
    -dontnote retrofit2.Platform
    -dontwarn retrofit2.Platform$Java8
    -keepattributes Signature
    -keepattributes Exceptions
    
    ##---------------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
    -dontwarn sun.misc.**
    #-keep class com.google.gson.stream.** { *; }
    
    # Application classes that will be serialized/deserialized over Gson
    -keep class br.com.adley.ipubg.data.** { *; }
    -keep class br.com.adley.ipubg.wrapper.** { *; }
    
    # Prevent proguard from stripping interface information from TypeAdapterFactory,
    # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
    -keep class * implements com.google.gson.TypeAdapterFactory
    -keep class * implements com.google.gson.JsonSerializer
    -keep class * implements com.google.gson.JsonDeserializer
    
    ##---------------End: proguard configuration for Gson  ----------
    

    Thanks all guys for the comments.