我是一名老学校开发人员(好吧,我20岁,我不是老上学,我只是喜欢打印而不是使用逐步调试器:P)我有很多Log.i()调用Android应用程序。我想知道它是否会对应用程序的性能产生影响?
我知道我应该使用逐步调试器,只是调试多个线程可能有点麻烦。
感谢您的帮助!
答案 0 :(得分:5)
我认为Log不会影响应用程序性能,因为在发布应用时,您可以通过设置debuggable
在Android Manifest中关闭它:
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:debuggable="false">
答案 1 :(得分:4)
我仍然在研究自己的Android编码,但是从目前为止我看到的我认为Android日志记录遇到的问题与大多数Java日志框架遭受的问题相同(值得注意的例外是SLF4J),即:
开发人员通常通过添加保护块来处理此问题
if (log.isDebugEnabled()) {
log.debug("...");
}
我认为Android SDK也可以这样做。它覆盖了#2和#3,但仍然保留了包含未使用的日志记录代码的发布代码。当然假设您永远不想在发布情况下启用调试日志记录。
SFL4J BTW,不需要保护块,因为它使用C类方法调用,它会延迟字符串汇编,直到实际需要它为止。不幸的是,似乎Android没有沿着这条路走下去。 iOS也没有这个问题,因为它有一个预编译器。我经常希望Java保留的东西。
无论如何,我不主张删除日志以支持调试器。恕我直言他们服务于两个不同的目记录我发现在理解应用程序的流程时非常有用(如果操作正确)。我经常通过查看我在调试器中找不到的日志来发现问题。 IE浏览器。跨多个类(特别是在UI类中)执行不必要的代码,奇怪的数据问题不会导致实际的错误等。在这些情况下,使用调试器就像尝试用勺子打造混凝土一样。另一方面,调试器非常适合分析日志记录突出显示的问题的精细细节。
所以在我的代码中,我倾向于有相当数量的日志记录,旨在告诉我应用程序正在做什么,以英语的方式,这样我就可以轻松阅读并理解正在发生的事情。但我对保持尽可能低的水平非常严格。 IE浏览器。不要在信息级别记录内容,除非你想要在发布模式下看到它。我发现很多开发人员都倾向于打破这个。
更新:请阅读Remove all debug logging calls before publishing: are there tools to do this?,其中介绍了如何使用ProGuard从发布代码中删除日志记录。好主意,意味着您不能在日志记录中使用保护块,并尽可能多地放置,但仍然可以放心,您的发布代码将会很快。
答案 2 :(得分:2)
如果切换到Log.d,则可以调试应用程序,在构建发行版时,不会编译或执行这些调用。
答案 3 :(得分:1)
是的,确实有性能损失。检查一下:Log.d and impact on performance
答案 4 :(得分:0)
答案是肯定的,不是。
这取决于你有多少日志调用,当你在谈论步骤调试时,我猜你现在并不担心发布代码(当你明显删除过多的日志记录时)。 / p>
我使用了过多的日志记录,它溢出了logcat,但只是在我的调试代码中尝试追踪一个特别难以捉摸的问题时 - 我一跟踪问题就立即删除了日志。
简而言之,在开发中尽可能多地记录,但不要对用户造成影响。