【发布时间】:2013-05-30 22:13:28
【问题描述】:
我刚刚发现 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)。所以,我可以替换这个配置的proguard(但这不是这个问题的重点)。
【问题讨论】:
-
请问您一个问题...您为什么使用 ProGuard?为了什么?
-
@AdamStelmaszczyk:主要是代码混淆。但是,日志删除是对整体应用程序混淆的一个很好的补充。为什么要问?
-
因为我认为这不值得你花时间。检查 ProGuard 生成的代码(反编译 apk)。您将看到您可以轻松阅读“混淆”版本。您可以使用简单的
boolean DEBUG = false标志删除日志。我扔掉了 ProGuard,因为它带来的问题多于好处。 -
如果您将
if (DEBUG) Log.d("")和DEBUG设为false,javac将删除它,因为它是无法访问的代码。 -
ProGuard 会删除执行应用程序不需要的所有信息(调试信息和未使用的代码)。它减少了代码大小,提高了性能,通常是保护应用程序的良好第一步。如果您需要更多:DexGuard 积极打击逆向工程,使用不适合开源程序的技术。 (我是 ProGuard 和 DexGuard 的开发者)
标签: android obfuscation proguard