0

多亏了 Proguard 的优化功能,我现在可以在我的代码中执行尽可能多的调试日志记录 - 对于生产,我只是让它剥离所有这些不必要的代码。

这很好并且有效(使用最新的 Proguard 版本)。

但是:在我走这条路之前,我final static boolean DEBUG一直在“守护”我所有的Log.d/Log.v呼叫。为了确保我不会忘记为已签名的生产 apk 禁用它,我只是在我的 UI 主要活动中添加了一个易于查看的附加组件,在某个角落放置了一个丑陋的文本“DEBUG IS ON”。

因此,在生成我的最终 apk 时,我所要做的就是安装一次 - 以防我忘记关闭调试模式,这会提醒我。

现在,随着 Proguard 完成删除调试日志调用的工作:我如何在我的应用程序中检测到它并控制状态为“调试已打开”的 UI 元素?任何的想法?

我的第一次尝试是尝试这个:

boolean loggingEnabled = false;
Log.d(TAG, (loggingEnabled = true) ? "Logging test" : "");

我希望 Proguard 也能取消这项任务loggingEnabled=true——但我低估了 Proguard。它删除了对 的调用Log.d,但仍然执行分配... :)

4

1 回答 1

0

你可以做几件事:

  • 检查 proguard 输出文件夹中的 mapping.txt:grep -E '(android/util/|de/ub0r/android/logg0r/)Log.[dv]' */build/proguard/release/dump.txt
  • 运行应用程序并检查是否打印了任何 d/v 日志。
  • 反编译应用程序并查看调用Log.d()和的源代码Log.v()

我构建了一个简单的包装库,让它更方便一点:

https://github.com/felixb/ub0rlogg0r

- - 编辑 - -

要检查您的日志是否被剥离,请执行以下操作:

  1. 分叉 ub0rlogg0r。
  2. 添加public static boolean sHasDebugCalls = false;Log.
  3. 添加sHasDebugCalls = true到所有的Log.d()Log.v()方法。
  4. Log.d(TAG, "has debug logs")在你的应用程序的最开始的地方放置一个。
  5. 创建 UI 时,测试Log.sHasDebugCalls以决定 DEBUG 提醒的可见性。
于 2013-09-23T09:00:09.180 回答