android 写源代码,Android打印日志,实现快速定位源代码

本文介绍了如何在Android Studio中模仿系统错误日志,通过StackTraceElement类获取方法调用栈信息,实现在Log输出的日志中添加源代码链接,以便快速定位代码位置。作者分享了详细代码实现步骤和示例,适用于提升日志阅读效率。
摘要由CSDN通过智能技术生成

在Android Studio查看错误日志的时候,出错位置的代码前会出现链接,点击就会跳到源代码的位置,非常方便。但是我们平常使用的Log.x()方法打印出的日志却只能打印出简单的内容,如果内容一多,那么查看日志的时候就会非常乱,分不清哪行日志是在哪里打印出来的了。

所以就想到也可以仿照系统打印错误日志的方式打印我们自己的代码。点击一行日志,就能跳到对应的源代码位置。这里我们需要借助JDK自带的StackTraceElement类,可以用来获取方法的调用栈信息。

protected String getNameFromTrace(StackTraceElement[] traceElements, int place) {

StringBuilder taskName = new StringBuilder();

if (traceElements != null && traceElements.length > place) {

StackTraceElement traceElement = traceElements[place];

taskName.append(traceElement.getMethodName());

taskName.append("(").append(traceElement.getFileName()).append(":").append(traceElement.getLineNumber()).append(")");

}

return taskName.toString();

}

private String getContent(String msg, int place,Object... args) {

try {

String sourceLinks = getNameFromTrace(Thread.currentThread().getStackTrace(), place);

return sourceLinks + String.format(msg, args);

} catch (Throwable throwable) {

return msg;

}

}

因为Thread.currentThread().getStackTrace()得到的是一个数组,里面各个位置StackTraceElement保存的信息也不一样。所以我们可以简单循环,打印出每个对象出来。

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

printD("MyTag:", "xxxxx");

}

public void printD(String tag, String content, Object... args) {

for (int i = 0; i < Thread.currentThread().getStackTrace().length; i++) {

String realContent = getContent(content,i,args);

Log.d(tag, realContent);

}

}

582c3dac7d32

image.png

可以看到,前两个是VM和Thread的方法,第三个开始才是我们自己写的方法,因为我做了两次调用,所以出现了三个方法带链接,而第五个正式我们最初调用的代码位置,即place=4。如果间接调用的层次更多,那么位置也更靠后面。

最后我简单封装了下这个Log工具类,即可打印出点击跳到原位置的log。

public class LogUtils {

public static void PrintD(String content, Object... args) {

for (int i = 0; i < Thread.currentThread().getStackTrace().length; i++) {

String realContent = getContent(content, i, args);

Log.d("default", realContent);

}

}

public static void PrintD(String tag, String content, Object... args) {

Log.d(tag, getContent(content, 4, args));

}

private static String getNameFromTrace(StackTraceElement[] traceElements, int place) {

StringBuilder taskName = new StringBuilder();

if (traceElements != null && traceElements.length > place) {

StackTraceElement traceElement = traceElements[place];

taskName.append(traceElement.getMethodName());

taskName.append("(").append(traceElement.getFileName()).append(":").append(traceElement.getLineNumber()).append(")");

}

return taskName.toString();

}

private static String getContent(String msg, int place, Object... args) {

try {

String sourceLinks = getNameFromTrace(Thread.currentThread().getStackTrace(), place);

return sourceLinks + String.format(msg, args);

} catch (Throwable throwable) {

return msg;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值