Proguardがアプリケーションを最適化すると、へのすべての呼び出しObject#wait()
が削除されていることがわかります。
そのため、パッシブに待機する必要がある各スレッド(通知まで)がアクティブに待機するようになります(CPU使用率100%)。
最適化がシャットダウンされたら、-dontoptimize
すべてがOKです。
でいくつかのメソッドを削除するための最適化が必要ですか-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;
}