Android Debug 之 Log 最佳实践 (2)

控制台输出如下:

Android Debug 之 Log 最佳实践


可以看到代码所在的类和行数到显示为链接文本,点击会定位到具体的位置。

做了封装的情况

一般我们对 Log 都会做封装,因此假设我们有一个 LogUtils 类,我们在 MainActivity.java 里面调用。

LogUtils.java:

class LogUtils { public static void loge() { Log.e("ZLog", ZLogHelper.wrapMessage(2, "just test")); } }

MainActivity.java:

LogUtils.loge();

我们先看下结果,再来分析。控制台输出如下:

Android Debug 之 Log 最佳实践

可以看到确实定位到了 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:

allprojects { repositories { ... maven { url 'https://jitpack.io' } } }

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

Android Debug 之 Log 最佳实践

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypjxz.html