2017-10-15 9 views
1

Je crée une application Android native et je souhaite la publier. J'utilise retrofit et convertisseur Gson.Erreur lors de l'utilisation de proguard Retrofit2 et GSON Converter

Aussi une vue de recherche. Pour la sortie, je l'ai mis en place les règles ProGuard, comme le suggère la modernisation:

# 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 

En retrofit j'utilise: 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; 
    } 
} 

En mode débogage ou lorsque proguard est hors ligne, il fonctionne parfaitement. Mais quand je produis signé avec l'application proguard et faire une mise à niveau en utilisant GET, je reçois l'erreur suivante:

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

J'ai essayer beaucoup de configs ProGuard. Je pourrais penser que l'erreur est liée au convertisseur GSON.

Je l'ai déjà essayé:

#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 *;} 

MISE À JOUR

J'ai ajouter les GSON configs pro-garde:

##---------------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 ---------- 

Mais toujours obtenir une erreur:

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

Gson a également des règles proguard que vous semblez manquer https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg –

+0

Merci pour la réponse, je vais vérifier il. – Adley

+0

Malheureusement, toujours pas de travail :( – Adley

Répondre

0

Après avoir vérifié les commentaires, j'ai ajouté des règles de proguard GSON et des améliorations. En outre, soyez prudent si vous avez un emballage qui utilise vos modèles, il provoquera des erreurs de conversion.

Mes règles pro-garde finale, travaille maintenant, est:

# 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 ---------- 

Merci à tous les gars pour les commentaires.