发布时的android.util.Log - 我能做什么/不做什么

时间:2010-11-16 22:12:04

标签: android debugging design-patterns logging logcat

我的代码中有很多Log.i Log.d Log.e,我已经完成了最新的应用程序。我即将发布这个应用程序,我不想让人们在将手机插入adb时看到它,但我确实希望它可以用于我自己的调试。

我想扩展android.util.log并且在那里只有一个布尔开关所以我可以在发布时关闭日志并在开发时打开它但这个类是最终的,我错过了一个技巧吗?

我真的不想通过我的代码删除所有,如果最坏的情况发生,那么我可以执行ctrl + h全局替换Log for // Log但是这确实很糟糕。

我也意识到Log.d在运行时被删除但它仍然运行(失去一点性能)所以不运行这将是一个额外的好处。

是的,所以基本上我正在寻找一种以编程方式打开和关闭调试的方法,这也可以让我稍后将其作为首选项或某些内容,如果人们想要查看它或帮助并发送它。

你们为此实施了什么?

由于

3 个答案:

答案 0 :(得分:16)

正如Octavian指出插入日志记录常量将是最好的方法。如果启用调试,则为此调用原始日志记录方法编写一个新类不是一个好主意。

良好做法:

if (C.D) { Log.d(C.T, "your log text here " + foo + bar); }

不良做法:

YourLog.d("your log text here " + foo + bar);

// and in YourLog.java's d() method:
... { if (debugging) Log.d(tag, text); }

如果C类的常数D为假,则第一种解决方案非常快。如果您有用于创建日志字符串的复杂字符串操作,则在取消激活调试时将不会执行这些操作。如果D为false,编译器甚至可以在编译时删除这些操作,这可能导致零运行时开销。第二个(坏)解决方案将始终构建整个字符串并调用一个方法,这是您不需要的开销。

一般来说,第一种解决方案是最好的。是的,我真的称之为类和成员C,D和T(常量/调试/标记) - 出于性能原因在打字过程中。 ; - )

答案 1 :(得分:2)

使用Proguard进行混淆,因为proguard有命令用来在编写proguard配置文件时将其过滤掉...简单且有效

答案 2 :(得分:2)

通常不要以任何方式将它们包含在您的分发代码中,因为它们需要进行处理,这只会导致不必要的电池消耗。

您可以在应用程序中的某处设置一个布尔值来指示代码的开发或发布版本,并且有很多if块检查标志并执行您的日志代码,但这只会导致代码膨胀。

一旦你不再需要它们,你应该摆脱它们。