控制台输出如下:
可以看到代码所在的类和行数到显示为链接文本,点击会定位到具体的位置。 做了封装的情况
一般我们对 Log 都会做封装,因此假设我们有一个 LogUtils 类,我们在 MainActivity.java 里面调用。
LogUtils.java:
class LogUtils { public static void loge() { Log.e("ZLog", ZLogHelper.wrapMessage(2, "just test")); } }MainActivity.java:
LogUtils.loge();我们先看下结果,再来分析。控制台输出如下:
可以看到确实定位到了 MainActivity.java 中的具体使用地方。
那么为什么这里传入的 stackIndex 跟第一种不一样,是 2 而不是 1 呢?
其实答案很简单,你改为 1 之后,输出的控制台显示的会定位到 LogUtils 里面的日志打印语句处。在这里就是:
Log.e("ZLog", ZLogHelper.wrapMessage(2, "just test"));所以其实你可以看出一个规律,而这个从代码也可以发现。
因为代码里面解析调用位置是根据栈来的,对 StackTraceElement 进行分析,因此情况一直接使用,传入 1。而情况二多了一层函数调用,通过 loge 方法做了一层包装。因此需要传入 2。如果你再套一层,那么需要传入 3。了解了这一点,我们下面的工具类相信你就看得懂了。
ZLog如果你不想自己手动传入 stackIndex,可以直接使用我们提供的工具类 ZLog。
public class ZLog { private static boolean isDebugMode = false; public static void setDebugMode(boolean debugMode) { isDebugMode = debugMode; } private static boolean isLinkMode = true; public static void setLinkMode(boolean linkMode) { isLinkMode = linkMode; } private static final int CALL_STACK_INDEX = 3; public static int v(String tag, String msg) { return isDebugMode ? Log.v(tag, mapMsg(msg)) : -1; } public static int d(String tag, String msg) { return isDebugMode ? Log.d(tag, mapMsg(msg)) : -1; } public static int i(String tag, String msg) { return isDebugMode ? Log.i(tag, mapMsg(msg)) : -1; } public static int w(String tag, String msg) { return isDebugMode ? Log.w(tag, mapMsg(msg)) : -1; } public static int e(String tag, String msg) { return isDebugMode ? Log.e(tag, mapMsg(msg)) : -1; } private static String mapMsg(String msg) { return isLinkMode ? ZLogHelper.wrapMessage(CALL_STACK_INDEX, msg) : msg; } }相信有了前面的知识,小伙伴对于这里为什么传入 3 应该了解了。
1 的话会定位到
return isLinkMode ? ZLogHelper.wrapMessage(CALL_STACK_INDEX, msg) : msg;2 的话(以 e 为例)会定位到
return isDebugMode ? Log.e(tag, mapMsg(msg)) : -1;3 的话才能够定位到外面具体的调用处。
优化我们知道,虽然 ZLog 做了封装,但是我们每次打日志都要传入 ZLog,有点麻烦?
能否提供一个默认的 TAG,允许对外设置。
可以的,我们修改如下(以 e 为例):
private static String tag = "ZLOG"; public static void setTag(String tag) { if (!TextUtils.isEmpty(tag)) { ZLog.tag = tag; } } public static int e(String tag, String msg) { return isDebugMode ? Log.e(mapTag(tag), mapMsg(msg)) : -1; } public static int e(String msg) { return isDebugMode ? Log.e(tag, mapMsg(msg)) : -1; } private static String mapTag(String tag) { return TextUtils.isEmpty(tag) ? ZLog.tag : tag; } 项目实战按照下面两步引入开源库。
Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
Step 2. Add the dependency
dependencies { implementation 'com.github.nesger:AndroidWheel:1.0.0' }使用时先打开开关:
ZLog.setDebugMode(true);然后就可以直接使用了。
温馨提示由于带链接的 debug 对性能有一定影响,因此建议开发使用,上线关闭。
结语这边在完善一个开源仓库 AndroidWheel,跟名字一样,避免重复造轮子。
目前 1.0.0 版本提供日志相关工具类,1.0.1 增加了防抖动 EditText。
后续会继续更新迭代,功能会更完善更全面。
觉得不错,欢迎给个 star 哈~
参考链接:
Android Studio Pro Tip: go to source from logcat output