Proguard的哪个优化选项删除了if()语句?

时间:2014-09-09 15:23:40

标签: java optimization proguard

我确实在ProGuard 4.11上遇到了问题,该问题删除了if语句if (a!=null) { a.a(); }并保存a.a();
我认为ProGuard正在考虑{{1} }不能是a,但这是错误的。这导致NullPointerException。
if语句是从涉及父母构造函数的复杂构造中调用的。
问题: 是否可以阻止ProGuard进行此优化,而不停用所有优化? 是否有任何过滤器优化选项?

问候。

2 个答案:

答案 0 :(得分:2)

你没有给我们任何代码,所以让我们看看我的水晶球是否有效。

  

if语句是从涉及父构造函数的复杂构造中调用的。

它看起来像这样:

class Base {
    Base {
        m(); // <- problem here
    }

    abstract void m();    
}

class Derived extends Base {
    Derived() {
        this.a = new A();
    }

    void m() {
        a.a();
    }

    private final A a;
}

从构造函数调用非final方法是不好的。方法m依赖于Derived构造函数设置a但过早调用它。

  

看起来更像是应该提交针对ProGuard的错误,而不是解决问题。

我建议两者兼顾。 ProGuard对奇怪的代码进行非法优化。

对于我上面的代码片段,没有相同的好代码。对于您的真实代码,很可能是。

答案 1 :(得分:0)

这个问题总是出现在proGuard 5.2中,所以我必须看一下修复.. 在proGuard的配置文件中,可以通过输入以下内容来取消激活此优化:

-optimizations "!field/propagation/*"

现在,正如maaartinus所说,这种结构是不行的,我更愿意通过删除&#34; final&#34;来解决问题。来自相关领域的关键词,这就是我给他正确答案的原因 如果您无权访问来源,则应优先停用字段/传播优化。
待处理的错误报告:https://sourceforge.net/p/proguard/bugs/531