本文微信公众号「AndroidTraveler」首发。
背景
在开发过程中,调试是必不可少的一项工作。
当我们要确定项目的逻辑时,当我们要了解界面的生命周期时,当我们发现新写的逻辑与期望效果不一致时,当我们觉得数据有问题时…
而调试有两种方式:
第一种就是使用 debug 模式运行 APP,然后通过断点让程序运行到指定位置进行分析。
第二种就是打日志的方式,通过观察输出来确定程序是否运行到该位置以及此时的数据。
本篇文章主要聚焦在第二种方式上面。
在 Android 里面,打日志使用的系统 API 是 Log,你以为直接使用就完了吗?
封装
假设你在需要打印日志的地方直接使用系统的 API,那么当遇到下面情况时,会「牵一发而动全身」。
场景一:如果我打印日志要用三方库的日志 API,那么我要查找项目所有使用位置,并一一替换。
场景二:如果我希望在开发环境下打印日志,release 环境不打印,这个时候每个位置都需要单独做处理。
因此我们需要在使用 Log 进行日志打印之前,做一层封装。
假设我们的类名字为 ZLog,代码如下:
import android.util.Log;
/**
* Created on 2019-10-26
*
* @author Zengyu.Zhan
*/
public class ZLog {
public static int v(String tag, String msg) {
return Log.v(tag, msg);
}
public static int d(String tag, String msg) {
return Log.d(tag, msg);
}
public static int i(String tag, String msg) {
return Log.i(tag, msg);
}
public static int w(String tag, String msg) {
return Log.w(tag, msg);
}
public static int e(String tag, String msg) {
return Log.e(tag, msg);
}
}
这样处理之后,对于场景一和场景二,我们需要修改的只是 ZLog 这个类,而不需要到具体使用 ZLog 的所有地方去修改。
提供日志打印控制
我们知道,日志打印可能包含敏感信息,而且过多的日志打印可能影响 APP 的性能,因此我们一般是在开发时候打开日志,在发布 APP 之前关闭。
因此我们这边需要提供一个标志位来控制日志的打印与否。
import android.util.Log;
/**
* Created on 2019-10-26
*
* @author Zengyu.Zhan
*/
public class ZLog {
private static boolean isDebugMode = false;
public static void setDebugMode(boolean debugMode) {
isDebugMode = debugMode;
}
public static int v(String tag, String msg) {
return isDebugMode ? Log.v(tag, msg) : -1;
}
public static int d(String tag, String msg) {
return isDebugMode ? Log.d(tag, msg