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

时间:2012-05-08 09:00:54

标签: java multithreading optimization 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;
    }
}

正在被此代码替换(在反编译优化代码之后): 已移除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}}

1 个答案:

答案 0 :(得分:6)

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