Log认识:
开发中除了代码,注释和log也是必不可少的一部分,详细的注释和关键的log可以为我们开发提供很好的测试和分析。
Android sdk为我们提供了Log类的API,并且分了不同的日志级别:
Log.v()
Log.d()
Log.i()
Log.w()
Log.e()
分别对应
VERBOSE、DEBUG、INFO、 WARN、 ERROR、
其中Verbose不会在release版本中被编译进应用程序包中,而Debug日志根据Android API说会在运行时被去掉,另外的三个则会一直被保留。
查看官方文档给出的用法:
官方建议我们打日志的通用做法是:在你的类中声明一个常量TAG,但如每个类都要声明TAG,日志不能追踪哪个类,哪个方法、哪一行,某些日志在App发布时不能自动删除,还需要手动修改或者删除等等。这里针对这些问题整理一些小技巧
封装自己的LogUtils:
1:去掉TAG:我们可以用类名来作为TAG的内容,获取方法名和行数:
2:发布时去除日志 ,Android的BuildConfig有一个很合适的DEBUG可以用,它在你发布release版本,这个bool值自动变为false;所以我们可以利用这一点,重新定义写Log的方法:
3:封装log打印格式的方法(也可以根据自己的习惯,修改定义):
4:LogUtils封装源码:
/**
* 对系统给出的Log的API进行封装
*
* @author Smart
*/
public class LogUtils {
static String packageName = "com.horizon.fmtx";
static String className; // 类名
static String methodName; // 方法名
static int lineNumber; // 行数
// 私有化方法
private LogUtils() {}
/**
* 判断当前的是否为debug版本
*
* @return true是debug版本 false debug版本
*/
public static boolean isDebuggable() {
return BuildConfig.DEBUG;
}
/**
* 封装需要打印Log的格式
*
* @param log 要打印的具体log
* @return 返回添加了类名、方法名、行号及打印log的 字符串
*/
private static String createLog(String log) {
StringBuffer buffer = new StringBuffer();
buffer.append(methodName);
buffer.append("(").append(className).append(":").append(lineNumber)
.append(")");
buffer.append(log);
return buffer.toString();
}
/**
* StackTraceElement表示StackTrace(堆栈轨迹)中的一个元素,属性包括方法调用者的类名、方法名、文件名以及调用的行数。
* 通过StackTraceElement来获取打印log的方法所在类名、行号、方法名等。
* @param sElements
*/
private static void getMethodNames(StackTraceElement[] sElements) {
className = sElements[1].getFileName();
methodName = sElements[1].getMethodName();
lineNumber = sElements[1].getLineNumber();
}
public static void e(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.e(className, createLog(message));
}
public static void i(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.i(className, createLog(message));
}
public static void d(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.d(className, createLog(message));
}
public static void v(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.v(className, createLog(message));
}
public static void w(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.w(className, createLog(message));
}
public static void wtf(String message) {
if (!isDebuggable())
return;
getMethodNames(new Throwable().getStackTrace());
Log.wtf(className, createLog(message));
}
}