Android studio 1.1.0设置minifyEnabled true导致app的问题

Pdk*_*ock 12 android proguard android-studio android-gradle-plugin retrofit

这是我的gradle.build文件

defaultConfig {

    minSdkVersion 15
    targetSdkVersion 21
    versionCode 2
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

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.**
Run Code Online (Sandbox Code Playgroud)

我有一个java类作为

public class Endpoints {
    public final static String GET_ENDPOINT = "MY_ENDPOINT";
}
Run Code Online (Sandbox Code Playgroud)

我在改装的restadapter中使用的

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

现在当minifiyEnabled为false时,整个代码工作正常但我将minifyEnabled设置为true,网络调用不会发生.我的应用程序在启动后立即调用此端点,但网络日志不会显示正在进行的网络请求.谁能告诉我这里有什么问题?

Pdk*_*ock 16

Proguard与我在项目中使用的许多库不兼容.

对于gson,我添加了gson团队提供的proguard规则,网址http://google-gson.googlecode.com/svn/trunk/examples/android-proguard-example/proguard.cfg

你需要改变

-keep class com.google.gson.examples.android.model.** { *; }
Run Code Online (Sandbox Code Playgroud)

-keep class com.your.package.name.your.models.** { *; }
Run Code Online (Sandbox Code Playgroud)

要进行改造,您需要添加

-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}
Run Code Online (Sandbox Code Playgroud)

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

对于joda图书馆我添加了

-keep class org.joda.time.** { *; }
-dontwarn org.joda.time.**
Run Code Online (Sandbox Code Playgroud)

对于otto,你需要添加

-dontwarn com.squareup.**
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}
Run Code Online (Sandbox Code Playgroud)

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

我还补充道

-keep class com.squareup.okhttp.** { *; }
Run Code Online (Sandbox Code Playgroud)

在使用这些配置更改之前,我的应用程序从3.4 mb修剪为2 mb.使用这些更改后,它将它缩小到3.2 MB,所以我将使用minifyEnabled false.


Jam*_*mie 5

Proguard可能会混淆Retrofit / Gson使用的项目中的某些类。这将导致您的请求永远不会成功,因为解析失败。这是由于参数不匹配,例如String status可能会被String aProguard 变成。这与响应不匹配,因此失败。

简而言之,确保Retrofit / Gson用于创建和解析响应的所有类都被排除在Proguard的混淆之外