【问题标题】:Which optimization option for Proguard removes the if() statement?Proguard 的哪个优化选项删除了 if() 语句?
【发布时间】:2015-02-16 22:16:52
【问题描述】:

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

问候。

【问题讨论】:

  • 我会说你应该避免这样的空检查,并更多地担心你为什么传递了null 值。
  • 你能告诉我们一个发生这种情况的例子吗?看起来更像是您应该针对 ProGuard 提交错误,而不是解决该问题。
  • 问题更多的是要知道是否可以停用这种优化,而无需停用所有优化。 ProGuard 问题对我来说只是次要问题,因为我可以用 4.10 版本解决它(目前没有用 5.0 测试)

标签: java optimization proguard


【解决方案1】:

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

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;
}

从构造函数调用非最终方法是不好的。方法 m 依赖于 Derived 构造函数设置 a,但它被调用得太早了。

您似乎应该针对 ProGuard 提交错误,而不是解决该问题。

我建议两者都做。 ProGuard 对奇怪的代码进行了非法优化。

对于我上面的 sn-p 代码,没有等效的好代码。对于您的真实代码,很可能有。

【讨论】:

  • 嘿,你的例子很接近现实 :) 我故意省略了代码,因为我不想在 Stackoverflow 中发布 ProGuard 的错误问题。例如,我可以通过使用 ProGuard 4.10 来解决这个问题。我只是想知道是否可以停用这种优化,而无需停用所有优化。感谢您的良好回复,问候。
【解决方案2】:

proGuard 5.2 中始终存在此问题,因此我必须寻求修复.. 在 proGuard 的配置文件中,可以通过输入以下内容来停用此优化:

-optimizations "!field/propagation/*"

现在,正如 maaartinus 所说,这种构造是行不通的,我更愿意通过从相关字段中删除“final”关键字来解决问题,这就是我给他正确答案的原因。
如果您无权访问源,那么您应该更愿意停用字段/传播优化。
错误报告待定:https://sourceforge.net/p/proguard/bugs/531

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2010-12-31
    • 2019-04-15
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多