5

我刚刚发现 ProGuard 删除了一个我用来同步线程的 .wait() 调用,这导致了一个竞争条件,这导致了一天愉快的调试:) 无论如何......

我将其追踪到以下 proguard 配置:

-assumenosideeffects public class android.util.Log {
    <methods>;
}

我想了解为什么会这样。我不确定为什么假设删除 Log 类没有副作用会导致在不同的类/对象上删除 .wait() 。

我看到ProGuard 优化还删除了 #wait() 调用,Eric 解释说这样的事情可能会发生。不过,他没有解释原因。

另外,我在这里找到了如何删除日志的示例(http://proguard.sourceforge.net/index.html#manual/examples.html)。所以,我可以替换这个配置的proguard(但这不是这个问题的重点)。

4

1 回答 1

5

您的原始配置与 Log 的所有方法(显式或继承)匹配,包括 Object#wait()。它告诉 ProGuard wait() 方法没有副作用,并且可以在不损害程序的情况下将其删除。正如您所注意到的,这显然不是真的。使用 -assumenosideeffects,您应该始终明确列出可以安全删除的方法。

于 2013-06-02T14:27:45.300 回答