终端中查看某个app的logcat输出,支持关键字筛选,支持输出到文件

1,571 阅读4分钟

在只安装了adb环境的情况下,如何查看某个app的日志,同时筛选关键字?

如何配置adb环境,请移步mac下安装adb环境的三种方式

通过adb在终端中输出app的实时log

Logcat命令行工具

Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用使用 Log 类写入的消息。

在 Android Studio 中,您也可以从 Logcat 窗口查看日志消息。这里我们通过Logcat命令行工具来查看app输出的log。

连接设备

先将设备通过usb数据线连接到电脑,通过adb devices命令查看是否连接成功:

 $ adb devices
List of devices attached
e253ab4c	device

可以看到我的手机已经连接到adb了。

查看设备的所有logcat输出

在终端中输入adb logcat,即可以看到设备的所有logcat输出:

adb logcat -d

不过这明显不是我们想要的,我们需要的是某个app下的logcat输出,Logcat命令行工具中提供了相应的方式:

在这里插入图片描述

adb logcat -d --pid=xxx

这里的xxx表示我们目标app对应的pid

获取某个app的pid:

如何获取某个app对应的pid呢?

通过adb shell dumpsys 包名

可以通过adb shell dumpsys 包名获取pid,不过需要我们在手机上先打开这个app,因为pid是分配给进程的,进程启动以后才会分配pid。

$ adb shell dumpsys meminfo com.tinytongtong.androidstudy
Applications Memory Usage (in Kilobytes):
Uptime: 96780621 Realtime: 118699597

** MEMINFO in pid 7948 [com.tinytongtong.androidstudy] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap    13692    13608       20       29    22528    20066     2461
  Dalvik Heap     2645     2584       28       19    15183     2895    12288
 Dalvik Other     2272     2260       12        0
        Stack       60       60        0        0
       Ashmem      166      164        0        0
      Gfx dev      780      780        0        0
    Other dev       34        0       32        0
     .so mmap     9038       68     4892        4
    .jar mmap     5295        0     2344        0
    .apk mmap    22072      192    18124        0
    .ttf mmap     3043        0     1832        0
    .dex mmap    15582       20    14636        0
    .oat mmap       94        0       20        0
    .art mmap     6384     5888      128       18
   Other mmap     1631       68     1352        0
   EGL mtrack    30624    30624        0        0
    GL mtrack     6068     6068        0        0
      Unknown     1814     1760       20        1
        TOTAL   121365    64144    43440       71    37711    22961    14749

 App Summary
                       Pss(KB)
                        ------
           Java Heap:     8600
         Native Heap:    13608
                Code:    42128
               Stack:       60
            Graphics:    37472
       Private Other:     5716
              System:    13781

               TOTAL:   121365       TOTAL SWAP PSS:       71

 Objects
               Views:       45         ViewRootImpl:        1
         AppContexts:        5           Activities:        1
              Assets:       15        AssetManagers:        0
       Local Binders:       32        Proxy Binders:       43
       Parcel memory:       11         Parcel count:       42
    Death Recipients:        4      OpenSSL Sockets:        1
            WebViews:        0

 SQL
         MEMORY_USED:      511
  PAGECACHE_OVERFLOW:       75          MALLOC_SIZE:      117

 DATABASES
      pgsz     dbsz   Lookaside(b)          cache  Dbname
         4       32             22         0/23/2  /data/user/0/com.tinytongtong.androidstudy/databases/dokit-database
         4       12                         0/0/0    (attached) temp
         4       32             40         2/14/2  /data/user/0/com.tinytongtong.androidstudy/databases/dokit-database (2)
         4       32             40         1/15/2  /data/user/0/com.tinytongtong.androidstudy/databases/dokit-database (3)

在最上面的输出中,我们也可以很方便的看到pid:

MEMINFO in pid 7948

需要注意的是,pid是分配给进程的,如果app关闭了再重新打开,就会分配一个新的进程,同一个包名对应的pid就会变

通过adb shell dumpsys activity top | grep "ACTIVITY" -A 0

除了上面的方式,我们还有另一种方式,也需要app处于打开状态:

¥ adb shell dumpsys activity top | grep "ACTIVITY" -A 0
  ACTIVITY com.bbk.launcher2/.Launcher 2afc762 pid=3207
  ACTIVITY com.tinytongtong.androidstudy/.MainActivity 45d30ec pid=7948

可以清晰的看到我们目标包名com.tinytongtong.androidstudy的pid为7948

输出单个app的log:adb logcat -d --pid=xxx

接着使用我们获取到的pid,就可以输出目标app下的log了:

adb logcat -d --pid=7948

这里输出的logcat是app下所有的log,如果我们要定位具体问题还是远远不够的,还需要支持关键字筛选。

删选关键字:grep

接着我们借助grep命令进行筛选,比如说我要搜索的关键字是"Lifecycle":

$ adb logcat -d --pid=7948 | grep "Lifecycle"
09-23 12:49:09.169  7948  7948 E LifecycleAActivity: onCreate
09-23 12:49:09.195  7948  7948 E LifecycleAActivity: onStart
...

可以看到这里只输出了符合我关键字的log,任务基本完成。

输出到对应的文件中: xxx命令 > target.txt

当然了,如果想把输出结果保存到文件中,也是很方便的,在之前的命令后面添加 > logcat.txt,之前命令的输出结果就会被重定向到logcat.txt文件中。

adb logcat --pid=7948 -d | grep "Lifecycle" > logcat.txt

我们查看通过cat logcat.txt即可快速查看logcat.txt中的内容。

cat logcat.txt

这里的>表示覆盖文件内容,如果要追加文件末尾,可以换成>>