当Proguard优化我的应用程序时,会发现所有对Object#wait()
的所有来电都被删除了。
因此,应该被动等待的每个线程(直到通知)现在正在等待(100%CPU使用率)。
使用-dontoptimize
关闭优化时,一切正常。
我是否需要使用-assumenosideeffects
删除某些方法的优化,我正在寻找错误的内容
是否可以保留对Object#wait()
的所有调用进行优化(删除)?
还有其他解决方案吗?
编辑1: 例如这段代码:
@Override
public void run() {
isRunning = true;
try {
while (isRunning) {
if (parent.isActivate) {
parent.updateDriveButtons();
synchronized (this) {
wait(1000);
}
}
else {
synchronized (this) {
// Wait for that the page is activated.
Utils.wait(this);
}
}
}
}
catch (Throwable e) {
e.printStackTrace();
}
finally {
isRunning = false;
}
}
正在被此代码替换(在反编译优化代码之后):
已移除wait()
,只有monitorenter;
monitorexit;
可见同步...
public final void run()
{
this.isRunning = true;
try {
while (this.isRunning) {
if (this.parent.isShowing()) {
...
monitorenter;
monitorexit; continue;
}
monitorenter;
monitorexit;
}return;
} catch (Throwable localThrowable) {
Object Ljava/lang/Object;;
return;
} finally {
this.isRunning = false; } throw localObject1;
}
{{1}}
答案 0 :(得分:6)
您似乎指定了与-assumenosideeffects
匹配的Object#wait()
个选项。然后ProGuard很乐意为您删除这些电话。除了ProGuard手册中记录的选项之外,您可能不应添加-assumenosideeffects
选项。