Here's my gradle.build file
defaultConfig {
minSdkVersion 15
targetSdkVersion 21
versionCode 2
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Proguard-rules.pro file
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
-dontwarn com.squareup.**
-dontwarn okio.**
-dontwarn retrofit.**
-dontwarn org.joda.time.**
I have one of the java class as
public class Endpoints {
public final static String GET_ENDPOINT = "MY_ENDPOINT";
}
which I use in my retrofit restadapter as
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Endpoints.GET_ENDPOINT)
.setLogLevel(RestAdapter.LogLevel.NONE)
.setConverter(new GsonConverter(gson))
.setClient(new OkClient(BusProvider.getClientInstance()))
.build();
Now when minifiyEnabled is false, the entire code works just fine but I set minifyEnabled true, the network call doesn't happen. My app calls this endpoint as soon as it is launched but the network logs dont show the network request being made. Can someone tell me whats wrong here?
Proguard doesn't play well with many of the libraries I used in my project.
For gson I added the proguard rules given by the gson team at http://google-gson.googlecode.com/svn/trunk/examples/android-proguard-example/proguard.cfg
You need to change
-keep class com.google.gson.examples.android.model.** { *; }
to
-keep class com.your.package.name.your.models.** { *; }
For retrofit you need to add
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {
@retrofit.http.* <methods>;
}
Taken from here https://github.com/square/retrofit/issues/117
For joda library I added
-keep class org.joda.time.** { *; }
-dontwarn org.joda.time.**
For otto you need to add
-dontwarn com.squareup.**
-keepclassmembers class ** {
@com.squareup.otto.Subscribe public *;
@com.squareup.otto.Produce public *;
}
Taken from here https://github.com/StephenAsherson/Android-OttoSample/blob/master/proguard-project.txt
I also added
-keep class com.squareup.okhttp.** { *; }
Before using these configuration changes proguard trimmed my app from 3.4 mb to 2 mb. After using these changes it shrinks it to 3.2 mb so I am just going to go with minifyEnabled false.
Proguard is likely obfuscating some of your classes in your project that Retrofit/Gson is using. This results in your request never being successful because parsing fails. This is due to the parameters not matching e.g. String status
may turn into String a
with Proguard. This does not match the response, so it fails.
In short - make sure all your classes that Retrofit/Gson uses for creating and parsing the response are excluded from Proguard's obfuscation.