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