Android studio 1.1.0 设置 minifyEnabled true 导致应用出现问题
Android studio 1.1.0 setting minifyEnabled true causing issues with app
这是我的 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 class 作为
public class Endpoints {
public final static String GET_ENDPOINT = "MY_ENDPOINT";
}
我在改装 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,网络调用不会发生。我的应用程序在启动后立即调用此端点,但网络日志不显示正在发出的网络请求。有人可以告诉我这里有什么问题吗?
Proguard 可能会混淆您项目中 Retrofit/Gson 使用的某些 类。这会导致您的请求永远不会成功,因为解析失败。这是由于参数不匹配,例如String status
可能会随着 Proguard 变成 String a
。这与响应不匹配,因此失败。
简而言之 - 确保 Retrofit/Gson 用于创建和解析响应的所有 类 都从 Proguard 的混淆中排除。
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.**
对于奥托,您需要添加
-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。
这是我的 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 class 作为
public class Endpoints {
public final static String GET_ENDPOINT = "MY_ENDPOINT";
}
我在改装 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,网络调用不会发生。我的应用程序在启动后立即调用此端点,但网络日志不显示正在发出的网络请求。有人可以告诉我这里有什么问题吗?
Proguard 可能会混淆您项目中 Retrofit/Gson 使用的某些 类。这会导致您的请求永远不会成功,因为解析失败。这是由于参数不匹配,例如String status
可能会随着 Proguard 变成 String a
。这与响应不匹配,因此失败。
简而言之 - 确保 Retrofit/Gson 用于创建和解析响应的所有 类 都从 Proguard 的混淆中排除。
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.**
对于奥托,您需要添加
-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。