Proguard吃了我的Object.wait()

时间:2013-05-30 22:13:29

标签: android obfuscation proguard

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

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

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

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

我看到ProGuard optimization also remove #wait() calls埃里克解释说可能会发生这样的事情。但是,他没有解释原因。

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

1 个答案:

答案 0 :(得分:4)

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

相关问题