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

Blu*_*ell 8 debugging logging android design-patterns logcat

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

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

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

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

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

你们为此实施了什么?

谢谢

mre*_*elt 16

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

好的做法:

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

不好的做法:

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

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

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

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

  • 我仍然喜欢包装Log类有以下几个原因:(a)保持代码更清晰,(b)字符串连接+应该避免 - 包装器允许你使用StringBuilder或String.format,(c)可以改变实现进一步下线.说某些事情是"糟糕的",因为它"慢"是一种过早的优化......你认为这会使得代码在数百万种方法被调用时有多慢? (6认同)
  • 我投了这个答案,但也值得一提的是,如今Proguard很好地集成在Android Eclipse构建过程中,使用`YourLog.d()`的"坏习惯"可以很好:只需添加`YourLog.d( )`到Proguard要剥离的东西清单. (4认同)