把Android logcat信息显示在你的手机

前言

年前有个想法,过去后端调试接口的时候,需要对接网络请求的各个参数,每次要调试时的流程都是(对于Android客户端的我来说):
打开Android Studio → 连接设备或模拟器 → 开启logcat → 日志筛选

这样确实有点麻烦,有没有一种方式把网络请求和返回的日志全部打到Demo App里边显示?
答案当然是有!

上个demo图:

由于涉及公司接口的安全性,这里就不把具体的代码实现罗列出来了。。涉及的技术点不多,这边就重新做了个有点趣味性的答题demo:

逻辑很简单:点击“问题”按钮 → 打印日志 → 发送日志 → 筛选日志 → 更新UI(TextView)
此demo下载地址

简单介绍logcat

Android Studio 中的 "Logcat" 窗口会显示系统消息,例如在进行垃圾回收时显示的消息,以及使用Log 类添加到应用的消息。此窗口可以实时显示消息,也可以保留历史记录,因此你可以查看较早的消息。
通过 Log 类,你可以创建日志消息,这些消息会显示在 logcat 中。一般来说,你应使用以下日志方法,这些方法按照优先级从高到低(或者从最简略到最详细)的顺序列示:

  • Log.e(String, String) Error (错误:显示已经引发错误的问题,以及此列表中较低的消息级别)
  • Log.w(String, String Warn (警告:显示尚不是错误的潜在问题,以及此列表中较低的消息级别)
  • Log.i(String, String) Info (信息:显示常规使用情况的预期日志消息,以及此列表中较低的消息级别)
  • Log.d(String, String) Debug (调试:显示仅在开发期间有用的调试日志消息,以及此列表中较低的消息级别)
  • Log.v(String, String) Verbose (详细:显示所有日志消息(默认值))

功能实现

以下代码实现的是点击按钮,然后捕获输出日志的过程:

findViewById(R.id.log1).setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
        // 1.输出日志
        Log.e(TAG, ANSWER1);
		new Thread() {  // 2. 开启线程来捕获日志
			@Override
			public void run() {
				Process mLogcatProc = null;
				BufferedReader reader = null;
				try {
					mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "TextLogDemoTag:E *:S"});
					reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));
					String line;
					while ((line = reader.readLine()) != null) {
						//logcat打印信息在这里可以监听到
						Message msg3 = new Message();
						Bundle bundle = new Bundle();
						msg3.what = 0x11;
						// 使用looper 把给界面一个显示
						if (line.contains(ANSWER1)) {
							bundle.putString("answer", line);
							msg3.setData(bundle);
                            // 3. 发送日志通知主线程更新UI
							mHandler.sendMessage(msg3);
						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}.start();
	}
});
··· ···
final Handler mHandler = new Handler() {
	@SuppressLint("SetTextI18n")
	@Override
	public void handleMessage(Message msg) {
		super.handleMessage(msg);
		if (msg.what == 0x11) {
			Bundle bundle = msg.getData();
			String answer = bundle.getString("answer");
			if (answer != null) {
				// 截取输出字符串:“03-25 11:02:53.411 4423-4423/demo.hzmd.com.textlogdemo E/TextLogDemoTag: 问题10答案:10次”
				String final_ans = answer.substring(answer.indexOf(":") + 1, answer.length());
				//更新UI
				show_log.setText(final_ans);
				process.setText(final_ans);
			} else {
				show_log.setText("无答案");
				process.setText("无答案");
			}
		}
	}
};
··· ···

观察一下可以知道,代码的逻辑主要分为四个部分:

  1. 首先通过Log.e(TAG, ANSWER1)输出日志到系统,日志级别我们设置为E
  2. 通过开启一个新的线程来捕获日志
  3. 通知主线程来更新UI:这里指的是刷新TextView的内容
  4. 主线程获取到数据,筛选截取有用的内容并更新UI

其中,关键是在于Runtime.getRuntime().exec(new String[]{"logcat", "TextLogDemoTag:E *:S"})这个方法。
Runtime.getRuntime().exec(String cmdarray[])方法主要用于执行外部的程序或命令,方法传入的是一个数组对象,包含所调用命令及其参数的数组。在代码中参数的含义是:

  • “logcat” 就是我们主要的logcat命令
  • “TextLogDemoTag” 表示监听的Tag 这里以上面点击按钮输出的LOG信息为例。
  • "E"表示监听的Log类型,当然这里还可以写其它类型 。VERBOSE(v) 、DEBUG(d)、 INFO(i)、 WARN(w)、 ERROR(e), 不过须要与监听的与Tag一一对称才可以。
  • "*:S"表示监听所有的信息,这里表示只要tag是TextLogDemoTag,Logcat类型为E 的 所有Log都会被获取到。
    TextLogDemoTag:E *:S这是一套规则,当然方法允许多个规则,你也可以添加多几个规则作为参数。

注意

最后记得在AndroidManifest.xml中中添加权限:
<uses-permission android:name="android.permission.READ_LOGS" />
我在demo代码中忘记了加,当然你如果把手机调为debug模式也可以不用加。。。。把?

参考文档

在Android界面上显示和获取Logcat日志输出
Android开发之在程序中时时获取logcat日志信息的方法
android 捕捉实时logcat日志 并且显示在textview中

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值