elo*_*lou 2 java optimization multithreading proguard
当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;
}
}
Run Code Online (Sandbox Code Playgroud)
正在被这段代码替换(在反编译优化代码之后):
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;
}
Run Code Online (Sandbox Code Playgroud)
您似乎在指定-assumenosideeffects也匹配的选项Object#wait().然后ProGuard很乐意为您删除这些电话.您可能不应该添加-assumenosideeffectsProGuard手册中记录的选项之外的选项.