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

标签 android obfuscation proguard

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

我追踪到以下混淆器配置:

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

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

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

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

最佳答案

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

关于android - Proguard 吃了我的 Object.wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16846691/

相关文章:

Android OpenCV 2.4.2 教程 Eclipse - 无法 dlopen 相机包装库

Android 在 RelativeLayout 中裁剪 View 的不可见部分

java - GridView 重复一张图像

android - 如何混淆 Jar 或 AAR 文件

.net - dotfuscator 套件的替代品?

android - 我需要在 proguard.cfg 中放入什么来启用混淆?

android游标到JSONArray

java - Proguard 文档

android - 在 Eclipse 中使用 ProGuard(没有私钥)

java - 使用带有gradle的proguard创建混淆的应用程序jar时出现重复的zip条目