如何在应用程序中检测到Proguard成功删除了所有日志调用?

时间:2013-09-23 08:48:46

标签: android logging proguard

感谢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的调用,但仍然执行了分配......:)

1 个答案:

答案 0 :(得分: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. Fork ub0rlogg0r。
  2. public static boolean sHasDebugCalls = false;添加到Log
  3. sHasDebugCalls = true添加到所有Log.d()Log.v()方法。
  4. 在应用的最开头的某处放置一个Log.d(TAG, "has debug logs")
  5. 创建用户界面时,请测试Log.sHasDebugCalls以确定DEBUG提醒的可见性。