android中java代码打印的log只有从tag来区分代码是那个模块的,android中带的Log函数也无法打印log信息所在的函数名和所在的行数等信息,这样看log不是很方便,于是想向c中获取函数名和行数的宏放到java的log中,这样打印的log 一眼就能函数log所在的文件 函数名 和行数,马上就能定位到log的具体位置,而且在android中用adb 打印的log在终端上显示的都是白色,将不同的log信息添加不同的颜色,这样看log会更方便,于是我对android中的Log等函数进行了一下封装,封装后的log可以实现上述的功能。
一下是封装的代码:
public final class log {
//当前文件名 行号 函数名
public static String getFileLineMethod() {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
StringBuffer toStringBuffer = new StringBuffer("[").append(
traceElement.getFileName()).append(" | ").append(
traceElement.getLineNumber()).append(" | ").append(
traceElement.getMethodName()).append("()").append("]");
return toStringBuffer.toString();
}
// 当前文件名
public static String _FILE_() {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
return traceElement.getFileName();
}
// 当前方法名
public static String _FUNC_() {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
return traceElement.getMethodName();
}
// 当前行号
public static int _LINE_() {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
return traceElement.getLineNumber();
}
// 当前时间
public static String _TIME_() {
Date now = new Date(0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return sdf.format(now);
}
public static void v(String msg) {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
StringBuffer toStringBuffer = new StringBuffer("[").append(
traceElement.getFileName()).append(" | ").append(
traceElement.getLineNumber()).append(" | ").append(
traceElement.getMethodName()).append("()").append("]");
String TAG = toStringBuffer.toString();
Log.v(TAG, msg);
}
public static void d(String msg) {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
StringBuffer toStringBuffer = new StringBuffer("[").append(
traceElement.getFileName()).append(" | ").append(
traceElement.getLineNumber()).append(" | ").append(
traceElement.getMethodName()).append("()").append("]");
String TAG = toStringBuffer.toString();
Log.d("\033[0;34m" + TAG , msg + "\033[0m");
}
public static void i(String msg) {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
StringBuffer toStringBuffer = new StringBuffer("[").append(
traceElement.getFileName()).append(" | ").append(
traceElement.getLineNumber()).append(" | ").append(
traceElement.getMethodName()).append("()").append("]");
String TAG = toStringBuffer.toString();
Log.i("\033[0;32m" + TAG,msg + "\033[0m");
}
public static void w(String msg) {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
StringBuffer toStringBuffer = new StringBuffer("[").append(
traceElement.getFileName()).append(" | ").append(
traceElement.getLineNumber()).append(" | ").append(
traceElement.getMethodName()).append("()").append("]");
String TAG = toStringBuffer.toString();
Log.w("\033[0;33m" + TAG,msg + "\033[0m");
}
public static void e(String msg) {
StackTraceElement traceElement = ((new Exception()).getStackTrace())[1];
StringBuffer toStringBuffer = new StringBuffer("[").append(
traceElement.getFileName()).append(" | ").append(
traceElement.getLineNumber()).append(" | ").append(
traceElement.getMethodName()).append("()").append("]");
String TAG = toStringBuffer.toString();
Log.e("\033[0;31m" + TAG,msg + "\033[0m");
}
}
这段代码你可以自己定义到一个文件中 如log.java 放到你要开发的代码中直接调用log.d log.e等相应函数就可以了,你也可以放到frameworks层中的系统的Log.java中,只需要在Log.java里的d、e等函数里做一下上述修改,然后在调用jni函数println_native 就可以了。
c和c++中的可以用相应的宏就可以了,相对来说简单的多。c c++自定义的log函数看下篇文章。
打印的log截图: