adb logcat 命令
adb 命令在移动端开发和测试中广泛使用 , 尤其在自动化测试脚本中很常见 .
adb logcat用于输出设备日志,分析错误原因 .
本章主要说明 adb logcat 命令 . 有四部分组成,分别是命令格式, 常用命令 , shell脚本输出指定app日志 ,android系统log缓冲区.
一.命令格式
adb logcat [选项] [过滤项], 其中 选项 和 过滤项 在 中括号 [] 中, 说明这是可选的;
选项解析:
1."-s"选项 : 只显示指定标签的日志; ------>adb logcat -s SWVDEC 显示SWVDEC标签的日志
2."-v"选项 : 设置日志的输出格式;----->adb logcat -v threadtime 查看日志输出时间和线程信息
3."-c"选项 : 清空所有的日志缓存信息;---->adb logcat -c
4."-d"选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;------->adb logcat -d
5."-t"选项 : 输出最近的几行日志, 输出完退出, 不阻塞;------>adb logcat -t 5 输出日志缓冲区的最近5行
6."-g"选项 : 查看日志缓冲区信息; ------>adb logcat -g
7."-B"选项 : 以二进制形式输出日志; ----> adb logcat -B
二.常用命令
1.过滤指定等级日志 比如: 显示Error以上级别的日志: adb logcat *:E 常用的还有D (debug以上级别), I (Info以上级别)
2.log输出到计算机文件 adb logcat > /home/cherish/log.txt ( 相对路径.绝对路径都可以.)
3.使用管道过滤日志
过滤指定标签"android"或者"system"标签的log,并输出到文件:
adb logcat | grep -E “android|system” > /home/cherish/log.txt
如下图:
4.将日志保存到文件 , 但无法输出到屏幕 , 针对这个问题可以采用 tee命令 .
adb logcat | grep -E “android|system” | tee /home/cherish/log.txt
5.给指定标签文字加颜色
比如:adb logcat | grep --color=auto -i android
过滤带有标签"android"的log,并给"android"字样加上颜色 .
6.输出带有某个包名的日志
adb logcat | grep “需要过滤的包名”
注:在windows上不能使用grep关键字,可以用findstr代替grep.
7.adb logcat -help 如果具体命令没记住 , 使用它查看简单的命令格式.
三.shell脚本输出指定app日志
思路: 先通过包名找到该进程的pid, 使用pid进行过滤该应用日志. 代码如下:
#!/bin/bash
packageName=$1
systemVersion="$(adb shell getprop ro.build.version.release)"
echo "systemVersion=$systemVersion"
version=`echo $systemVersion | awk -F '.' '{print $1}'`
ver=`expr $version + 0`
#android8.0及以上系统获取正在运行的进程pid需要加上-A: adb shell ps -A
if [ $ver -ge 8 ]; then
pid="$(adb shell ps -A | grep $packageName | awk '{print $2}')"
else
pid="$(adb shell ps | grep $packageName | awk '{print $2}')"
fi
echo "pid=$pid"
echo "-----------------------------"
adb logcat | grep --color=auto $pid
执行脚本命令 ./log.sh 包名
比如 ./log.sh com.android.systemui
四.知识扩展
1.android log系统组成
2.logcat缓冲区
android系统把log输出到不同的缓冲区中,目前定义了四个log缓冲区 .
- radio:输出通信系统(无线/电话相关)的log
- system:输出系统组件的log
- events:输出事件相关模块的log
- main:所有java层的log, 也是主缓冲区 (默认缓冲区)
缓冲区主要给系统组件使用,上层应用不需要关心,应用的log都输出到main缓冲区中
默认log输出(不指定缓冲区的情况下)是输出System和Main缓冲区的log
3.缓冲区模型