【发布时间】:2015-12-12 06:44:37
【问题描述】:
我的 Proguard 发布版本正在剥离我的成员字段的初始化值。这导致我的默认值丢失,导致我的调试和发布版本之间的行为不同。我怎样才能阻止这种情况发生?
这是我的源代码
public class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
@SerializedName("myField")
private boolean myFieldEnabled = true;
public boolean isMyFieldEnabled() {
return myFieldEnabled;
}
public void setMyFieldEnabled(boolean myFieldEnabled) {
this.myFieldEnabled = myFieldEnabled;
}
...
混淆后的代码如下所示(移除了 setter 和 getter):
public final class ai implements Serializable
{
private static final long serialVersionUID = 1L;
@z(x="myField")
public boolean myFieldEnabled;
这是我的 build.gradle 中的一个 sn-p:
release {
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'custom-proguard-rules-optimize.pro'
}
以下是我的自定义规则(来自 custom-proguard-rules-optimize.pro)中的关键 Proguard 优化规则:
# Disable the "code/allocation/variable" optimizations to workaround a
# Proguard bug. Source: http://stackoverflow.com/a/7587680/112705
-optimizations !code/simplification/arithmetic,field/removal/writeonly,!class/merging/*,!code/allocation/variable
-allowaccessmodification
以下是我们正在使用的 Android 默认规则中的关键 Proguard 优化规则(来自 proguard-android-optimize.txt):
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
我检查了the Proguard optimizations documentation,但没有看到涵盖此问题的优化或混淆选项。
更新
- 将
!field/*添加到我们的优化中并没有帮助 - 该字段似乎仍然没有被初始化。希望这种优化已经从 Android 默认的 Proguard 规则中得到了体现... - 删除
field/removal/writeonly没有帮助。 - 添加
!code/simplification/field没有帮助。
【问题讨论】:
-
首先使用“proguard-android.txt”而不是“proguard-android-optimize.txt”。文件中甚至说dex自己做了一些优化,不符合优化的proguard规则。
-
我想继续使用 Proguard 优化。
-
正如我所说,dex 无论如何都会进行一些优化。我建议您尝试使用未优化的 proguard 规则版本,如果它从那里产生正确的构建工作。 |||原来优化的规则里面有
!field/*,你的规则是不是少了一个感叹号? -
尝试为 Gson 添加这个 proguard sn-p。 github.com/krschultz/android-proguard-snippets/blob/master/…
-
由于proguard对类文件进行了混淆,你如何看待混淆后的代码?