我的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的一个片段:
release {
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'custom-proguard-rules-optimize.pro'
}下面是来自我的自定义规则(来自定制保护规则-最优化规则)中的关键保护优化规则:
# 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我检查了Proguard优化文档,没有看到一个优化或模糊选项来解决这个问题。
更新
!field/*添加到我们的优化中没有帮助--这个字段似乎仍然没有被初始化。希望这个优化已经从Android默认保护规则中获得了.field/removal/writeonly没有帮助。!code/simplification/field没有帮助。发布于 2015-09-23 12:15:38
我试图混淆一个可序列化的类,但我没有理解您的问题。我使用了默认的pro卫士Android-Optimize.txt和您的优化版本,一切都很好。
原始类
public class TestSerializable 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;
}
}后防
public final class p implements Serializable
{
@c(a="myField")
private boolean a = true;
public final boolean a()
{
return this.a;
}
public final void b()
{
this.a = false;
}
}我有三个建议
-keep class * implements java.io.Serializable添加到proguard文件中,看看会发生什么。setMyFieldEnabled(false)不是在每个new MyClass之后被调用,否则优化可以决定删除默认值。myFieldEnabled是公共的,因此可以从任何地方访问它。签入正在使用MyClass的模糊类,如果proguard用类似于ai a = new ai(); ai.myFieldEnabled = true;的代码替换了代码发布于 2015-09-23 15:48:40
尝试为实现可序列化的类声明默认构造函数。
public class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
@SerializedName("myField")
private boolean myFieldEnabled;
private MyClass() {
myFieldEnabled = true;
}
public boolean isMyFieldEnabled() {
return myFieldEnabled;
}
public void setMyFieldEnabled(boolean myFieldEnabled) {
this.myFieldEnabled = myFieldEnabled;
}对于默认的ProGaurd配置,请参见http://proguard.sourceforge.net/manual/examples.html#serializable
https://stackoverflow.com/questions/32595739
复制相似问题