8

我最近完成的一个应用程序的代码中有很多 Log.i Log.d Log.e。我即将发布这个应用程序,我真的不希望人们在将手机插入 adb 时看到它,但我确实希望它在那里用于我自己的调试。

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

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

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

是的,所以基本上我正在寻找一种方法来以编程方式打开和关闭我的调试,这也可以让我稍后将其设为偏好或其他东西,如果人们想要查看它或帮助并发送它。

你们为此实施了什么?

谢谢

4

3 回答 3

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(常量/调试/标记)——出于打字过程中的性能原因。;-)

于 2010-11-16T22:58:49.433 回答
2

使用 Proguard 进行混淆,因为 proguard 在编写 proguard 配置文件时有用于过滤掉它的命令.. 很好,很简单,它可以工作

于 2010-11-16T22:27:47.313 回答
2

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

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

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

于 2010-11-16T22:29:11.887 回答