首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保护程序移除成员字段初始化

保护程序移除成员字段初始化
EN

Stack Overflow用户
提问于 2015-09-15 21:13:07
回答 2查看 1.9K关注 0票数 1

我的Proguard发行版构建正在去掉我的成员字段的初始化值。这将导致我的默认值丢失,导致调试和发布版本之间的行为不同。我怎样才能阻止这种情况的发生?

这是我的源代码

代码语言:javascript
复制
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):

代码语言:javascript
复制
public final class ai implements Serializable
{
    private static final long serialVersionUID = 1L;
    @z(x="myField")
    public boolean myFieldEnabled;

下面是我的build.gradle的一个片段:

代码语言:javascript
复制
release {
    minifyEnabled true
    shrinkResources false
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'custom-proguard-rules-optimize.pro'
}

下面是来自我的自定义规则(来自定制保护规则-最优化规则)中的关键保护优化规则:

代码语言:javascript
复制
# 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):

代码语言:javascript
复制
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5

我检查了Proguard优化文档,没有看到一个优化或模糊选项来解决这个问题。

更新

  • !field/*添加到我们的优化中没有帮助--这个字段似乎仍然没有被初始化。希望这个优化已经从Android默认保护规则中获得了.
  • 移除field/removal/writeonly没有帮助。
  • 添加!code/simplification/field没有帮助。
EN

回答 2

Stack Overflow用户

发布于 2015-09-23 12:15:38

我试图混淆一个可序列化的类,但我没有理解您的问题。我使用了默认的pro卫士Android-Optimize.txt和您的优化版本,一切都很好。

原始类

代码语言:javascript
复制
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;
    }
}

后防

代码语言:javascript
复制
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;的代码替换了代码
票数 2
EN

Stack Overflow用户

发布于 2015-09-23 15:48:40

尝试为实现可序列化的类声明默认构造函数。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32595739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档