ProGuard优化还会删除#wait()调用

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)

Eri*_*une 6

您似乎在指定-assumenosideeffects也匹配的选项Object#wait().然后ProGuard很乐意为您删除这些电话.您可能不应该添加-assumenosideeffectsProGuard手册中记录的选项之外的选项.