4

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

1 に答える 1

8

-assumenosideeffectsにも一致するオプションを指定しているようObject#wait()です。その後、ProGuardはそれらの呼び出しを喜んで削除します。-assumenosideeffectsProGuardマニュアルに記載されているオプション以外のオプションを追加しないでください。

于 2012-05-08T13:33:04.660 に答える