Android Retrofit con Proguard – Como evitar errores con Gson

Si estas usando Retrofit en tu app Android y a la vez estas ofuscando y minizando tu app con proguard será necesario que agregues estas lineas a tu archivo proguard.txt

    # 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

Por otro lado, si estas mapeando tus archivos desde la response de Retrofit con Gson necesitarás además evitar que estas clases de tu modelo que mapeas sean modificadas por proguard. Para esto puedes agregar la anotación @Keep a tus clases

@Keep
public class User {

    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("username")
    @Expose
    private String username;
 ....

}

Observa en tu archivo proguard que por default este evita las clases anotadas de con @Keep

    # Understand the @Keep support annotation.
    -keep class android.support.annotation.Keep
    
    -keep @android.support.annotation.Keep class * {*;}
    
    -keepclasseswithmembers class * {
        @android.support.annotation.Keep <methods>;
    }
    
    -keepclasseswithmembers class * {
        @android.support.annotation.Keep <fields>;
    }
    
    -keepclasseswithmembers class * {
        @android.support.annotation.Keep <init>(...);
    }

Puedes, en vez de usar @Keep, agregar el paquete de tu modelo en el archivo proguard, aunque yo prefiero usar la anotación.

Suponiendo que las clases de tu modelo estan en “com.model” puedes agregar este paquete para que proguard lo mantenga intacto.

    -keep class com.model.** { *; }

Referencias: [http://square.github.io/retrofit/]2

Hi! If you find my posts helpful, please support me by inviting me for a coffee :)

Ver también