LOG 是任何一种编程语言的第一个API,一般被初学者用来打印
Hello, World!
。 有研究显示,
不使用 LOG 或者使用姿式错误的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟本身不爱的人结婚,而其他三成的人最后只能把遗产留给本身的猫。毕竟爱情须要书写,不能是一整张白纸。java
LogCat是Android开发者们最熟悉不过的日志打印工具,几乎每个Android项目里面都包含着大量的Log相关代码。不过,或许是由于Log实在是太过于普通,因此许多人在使用它的时候就显得很是随意,这些错误的使用姿式却会在不经意间给咱们带来很多的大坑。android
许多同窗喜欢在开发阶段用Log输出当前的一些环境数据,用于调试代码,可是在调试完成后却忘了关闭这些Log,致使发版出去的应用里面还会继续输出这些LOG,这样不只会形成没必要要的性能丢失,也会暴露一些敏感的数据,这些都是咱们不肯看到的。git
首先,咱们要给Log进行分级,规定“DEBUG版本输出哪一些级别的LOG并屏蔽哪一些级别的LOG,而RELEASE版本又输出另外一些级别的LOG并屏蔽另外一些级别的LOG”,这样在开发阶段可以输出咱们调试须要的LOG,而同时又能保证放送的版本可以屏蔽这些敏感的LOG。可是在开发阶段咱们不该该特地去注意这些细节,因此必须开发一个Log工具库,在框架层级解决这个需求。github
同时,须要注意的是,用于做为“开启/关闭Log”的开关必须是一个常量,而不能是一个变量(使用常量的话,在编译代码的时候,若是常量为false),编译器会直接把调试部分的Log代码直接去掉,而使用变量做为开关的话,这个判断逻辑会继续保留,一方面会形成性能丢失,另外一方面在运行时也能够经过Hack手段强行开启这部分Log代码。编程
另外,“开启/关闭Log”的开关必须写在Log方法外部,也就是说必须先判断“开启/关闭Log”条件,再调用Log方法,由于在调用Log方法的时候已经形成了性能丢失,并且调用方法的时候,会先构造好改方法须要的参数(按照参数顺序从右往左),再调用方法,而许多人喜欢在调用Log方法的时候计算须要打印出来的内容,这里是最容易形成性能丢失的地方。所以,若是为了图方便,写一个Log工具类,在工具类内部去判断是否应该开启或关闭Log,事实上已经形成了很多的性能丢失。正确的使用姿式应该是:服务器
public static final boolean DEBUG = true; if (DEBUG) { Log.v(TAG, "log something"); }
尽管Log形成的性能损失很小,可是若是在循环体内部循环调用Log方法的话,那整体的丢失的很是可观了,因此不该该在循环体内部使用Log,正确的作法是在循环体内部拼接须要打印的内容,等跳出循环体再一次打印出来。框架
除了常见的循环体外,还要一个须要注意的场景就是Adapter。ListView/RecyclerView是Android开发中最经常使用的控件,所以Adapter使用的情景也不少。滚动屏幕的时候,ListView/RecyclerView会在经过Adapter频繁地绑定ItemView和数据,并且这些都是在UI线程里进行的,因此若是在绑定的过程当中调用Log,可能会形成明显的卡顿。编程语言
至于Log到底会丢失多少性能,通常状况下,Log的性能丢失很小,毕竟是这么常见的系统Api,确定是身经百战,早就是“best performance”了。不过我曾经有个RecyclerView在MIUI上很是卡,一开始我是RecyclerView布局没优化好,最终定位到Adapter内部的一处Log上,卡顿的地方出如今Log的Native实现。MIUI到底对用户输出的日志作了什么处理呢?很是神奇。工具
在调试代码的时候,咱们常常经过LOG来定位Bug。同理,当线上的版本出现问题的时候,咱们也但愿能经过LOG来定位问题所在。可是问题是用户的设备上的打印出来的LOG咱们根本没有方法获取,惟一的手段就是当用户设备出现问题的时候,把设备借过来连上IDE用LogCat查看输出的LOG……显然这是不可行的。布局
这种时候,咱们能够在打印重要LOG(好比重要路径的触发点、或者一些异常类的信息)的时候,一并把这些信息记录到文件里。在用户反馈系统里面,一并将这些文件上传到咱们的用户反馈服务器,这样在处理反馈问题的时候,就能拿到重要的参考日志了。
BLog 是 Android SDK 的 LOG 工具 {@Link android.util.Log} 的增强版,以方便在开发时用来
操做调试日志。
简单易用的API;
支持输出线程信息;
支持设置LogLevel,方便在生产环境关闭调试用的LOG;
支持将LOG内容写入文件,以便经过文件LOG定位用户反馈的问题;
注意,尽管BLog支持关闭Log的输出,可是在你调用 BLog.v(String)
的时候,其实已经形成了性能
丢失,因此请尽可能使用正确的姿式来使用BLog,好比
if (BuildConfig.DEBUG) { BLog.v(TAG, "log verbose"); }
GitHub : https://github.com/kaedea/b-log
出处 : 使用 Log 的正确姿式