Android Studio 1.1.0设置minifyEnabled为true会导致应用程序出现问题。

14

这是我的 gradle.build 文件

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 文件

-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.**

我有一个Java类如下:

public class Endpoints {
    public final static String GET_ENDPOINT = "MY_ENDPOINT";
}

我在我的Retrofit RestAdapter中使用它作为

 RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(Endpoints.GET_ENDPOINT)
            .setLogLevel(RestAdapter.LogLevel.NONE)
            .setConverter(new GsonConverter(gson))
            .setClient(new OkClient(BusProvider.getClientInstance()))
            .build();

现在当minifiyEnabled为false时,整个代码能够正常运行,但是当我将minifyEnabled设置为true时,网络调用不会发生。我的应用程序在启动后立即调用此终端节点,但网络日志不显示网络请求被执行。有人可以告诉我这里出了什么问题吗?

2个回答

18

Proguard不适用于我在项目中使用的许多库。

对于gson,我添加了gson团队在http://google-gson.googlecode.com/svn/trunk/examples/android-proguard-example/proguard.cfg给出的Proguard规则。

你需要做出改变。

-keep class com.google.gson.examples.android.model.** { *; }

-keep class com.your.package.name.your.models.** { *; }

对于改装,您需要添加

-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}

摘自这里 https://github.com/square/retrofit/issues/117

为了joda库我添加了

-keep class org.joda.time.** { *; }
-dontwarn org.joda.time.**

对于otto,您需要添加

-dontwarn com.squareup.**
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}

从这里获取 https://github.com/StephenAsherson/Android-OttoSample/blob/master/proguard-project.txt

我还添加了

-keep class com.squareup.okhttp.** { *; }

在使用这些配置更改之前,Proguard已将我的应用程序从3.4 MB缩减到2 MB。但是,在使用这些更改后,它将其收缩到了3.2 MB,因此我只需选择minifyEnabled false。


你提供的示例链接已经失效了。你可以使用这个链接代替:https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg - w3bshark

6
Proguard很可能会混淆您项目中Retrofit/Gson所使用的一些类。这会导致解析失败,从而使您的请求无法成功。这是因为参数不匹配,例如String status在Proguard中可能会变成String a。由于与响应不匹配,因此请求失败。
简而言之,请确保所有用于创建和解析响应的Retrofit/Gson类均从Proguard的混淆中排除。

是的,那就是问题所在。我会发布一个具体的答案,解决了我的问题。 - Pdksock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接