在只安装了adb环境的情况下,如何查看某个app的日志,同时筛选关键字?
如何配置adb环境,请移步mac下安装adb环境的三种方式
通过adb在终端中输出app的实时log
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
这里的>
表示覆盖文件内容,如果要追加文件末尾,可以换成>>
。