wviana wviana - 1 year ago 126
Android Question

Proguard config to use retrofit Retrofit

my app is running all ok in debug, but when creating apk to release, I'm getting the follow error.

Process: neocom.dealerbook, PID: 9044
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at neocom.dealerbook.controller.k.a(MapActivity.java:103)
at neocom.dealerbook.controller.k.success(MapActivity.java:98)
at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

Here is the MapActivity.java:103

Callback<ClienteConfiguracao> callback = new Callback<ClienteConfiguracao>() {
int failCount = 0;
public void success(ClienteConfiguracao clienteConfiguracao, Response response) {
currentClient = clienteConfiguracao.getDealerships().get(0); /* Line 103 */

List<String> mAuthorization = clienteConfiguracao.getAuthorization();
toAllowPermissions = new HashMap<>();
Set<String> allImplementedKeys = PermissionManager.ALL_PERMISSIONS.keySet();
for (String key : mAuthorization) {
if (allImplementedKeys.contains(key)) {
List value = PermissionManager.ALL_PERMISSIONS.get(key);
toAllowPermissions.put(key, value);

Here is the proguard file that I build searching for the errors that I got, Retrofit site and others.

-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 retrofit.**
-dontwarn com.squareup.okhttp.**
-dontwarn okio.**
-dontwarn retrofit.appengine.UrlFetchClient
-keep class retrofit.** { *; }
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepattributes *Annotation*
-keepattributes SourceFile
-keepattributes LineNumberTable

-keepclasseswithmembers class * {
@retrofit.http.* <methods>;

Is there any tip about it?


When using retrofit with gson is important to add the Progard rule to the classes that are serialized and deserialized .

For example:

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

PS: Another advice is to use the rules snippets from this repository. There are rules for a lot of different libraries.