其他分享
首页 > 其他分享> > android-Proguard吃了我的Object.wait()

android-Proguard吃了我的Object.wait()

作者:互联网

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

我将其追溯到以下Proguard配置:

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

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

我看到ProGuard optimization also remove #wait() calls处的Eric解释了这种情况可能发生.但是,他没有解释原因.

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

解决方法:

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

标签:proguard,obfuscation,android
来源: https://codeday.me/bug/20191030/1970941.html