Android studio 1.1.0 setting minifyEnabled true causing issues with app

≡放荡痞女 提交于 2019-12-04 09:16:30

问题


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?


回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/29863368/android-studio-1-1-0-setting-minifyenabled-true-causing-issues-with-app

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!