【问题标题】:Android studio 1.1.0 setting minifyEnabled true causing issues with appAndroid studio 1.1.0 设置 minifyEnabled true 导致应用出现问题
【发布时间】:2015-07-03 23:53:05
【问题描述】:

这是我的 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";
}

我在改造后的适配器中用作

 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,网络调用不会发生。我的应用程序在启动后立即调用此端点,但网络日志未显示正在发出的网络请求。谁能告诉我这里出了什么问题?

【问题讨论】:

    标签: android android-studio android-gradle-plugin proguard retrofit


    【解决方案1】:

    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。

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,这就是问题所在。我将发布一个为我解决问题的具体答案。
    猜你喜欢
    • 2020-11-16
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多