把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中

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容