日志面面谈
为什么需要日志
复现问题,回溯到问题产生时候的系统状态,有利于定位和分析问题。
安卓日志有哪些?
cpu
关注的纬度:
- 单个应用使用
- 系统cpu分配
- 温度
有什么用:
- App卡顿、ANR
- App异常退出
怎么用:
1.应用使用
adb shell dumpsys activity processes >> D:\app_process.log
adb shell COLUMNS=512 top -n 1 -s cpu >>D:\cpu.log
adb shell COLUMNS=512 top -n 1 -s vss >>D:\cpu_vss.log
adb shell COLUMNS=512 top -n 1 -s thr >>D:\cpu_thr.log
- CPU内存
adb shell dumpsys cpuinfo >> D:\cpu_meminfo.log
- CPU温度
adb shell cat /sys/class/thermal/thermal_zone0/temp >> D:\cpu_tmp.log
内存存储器
关注的纬度:
- 系统内存分配情况
- adb shell COLUMNS=512 top -n 1 -s vss
- adb dumpsys meminfo
- 单个应用内存分配情况
- profile->memory->hprof
- adb shell dumpsys meminfo com.xx
- leakcanary
有什么用:
帮助定位内存抖动、内存溢出、内存泄漏的问题
怎么用:
- 系统内存
adb shell dumpsys meminfo >> D:\system_meminfo.log
- 指定app内存
adb shell dumpsys meminfo com.xx >>>> D:\com.xx_meminfo.log
adb shell am dumpheap com.xx/data/anr/Launcher.hprof
任务栈
关注的纬度:
- Ams Stack
- Service Stack
- Broadcast
有什么用:
关注界面上启动过的Activity、Service、Broadcast,分析页面导航异常、页面加载异常、后台任务异常的问题
怎么用:
1.activity
adb shell dumpsys activity >> D:\AmsStack.log
2.广播
adb shell dumpsys activity broadcasts >>D:\broadcasts.log
3.服务
adb shell dumpsys activity services >>D:\services .log
anr
关注的纬度:
- 系统anr日志
- Blockcanary日志
有什么用:
分析App无响应的原因、App被杀死的原因
怎么用:
adb pull /data/anr D:\2021\
trace
关注的纬度:
- trace日志
有什么用:
分析App无响应的原因、App被杀死的原因
Log
关注的维度:
- Systemlog
- Eventlog
- kernellog
怎么用:
- logcat输出
adb logcat -v time >D:\log.txt
- dev/log导出
adb pull /dev/log/ D:\ohters\
该目录有4种文件
- radio:输出通讯系统(无线/电话相关)的log。
- system:输出系统缓冲区的log。
- events:输出事件缓冲区的log。
- main:全部java层的log, 也是主缓冲区 (默认缓冲区)。
3.其他路径的日志按需导出
- /data/local/tmp/*
- /data/tmp/*
- /data/system/usagestats/*
- /data/system/appusagestates/*
- /data/system/dropbox/*
- /data/tombstones/*
- /data/anr/*
综上可以看到,要抓的日志真是太多了,抓起来麻烦,看起来汇总分析也麻烦,那么有没有一个现成工具供我们收集和分析呢,答案是有!安卓系统提供了Bugreport!
日志阅读的思路
第一步:定位进程死亡的时间点,参考《进程-确定进程死亡时间》
第二步:假设进程死亡的原因,设置怀疑点,根据经验搜索关键字。
第三步:复现出现异常的步骤,验证怀疑点是否正确
日志解析工具Bugreport
如何用
-
导出日志
adb bugreport 1>>D:\ohters\bugreport.log
-
下载ChkBugReport.jar
-
生成html报告
java -jar ./chkbugreport.jar ./bugreport.log
可能遇到的问题:
Failed to get bugreportz version, which is only available on devices running Android 7.0 or later. Trying a plain-text bug report instead.
解决步骤:
- 下载21版本的adb
- 关闭正在运行的高版本adb
adb kill-server
- 指定21版本的adb来捕获日志
D:\ohters\adb bugreport 1>>D:\ohters\bugreport.log
有什么用
输出到Android系统的Bugreport包含系统服务 (dumpsys)、错误日志 (dumpstate) 和系统消息日志 (logcat) 的诊断输出。系统消息包括设备抛出错误时的堆栈轨迹,以及从所有应用中使用 Log 类写入的消息。
配合安卓工具ChkBugReport可以将日志信息可视化显示到静态页面种。
日志分析经验积累
日志阅读的思路
第一步:定位进程死亡的时间点,参考《进程-确定进程死亡时间》
第二步:假设进程死亡的原因,设置怀疑点,根据经验搜索关键字。
第三步:复现出现异常的步骤,验证怀疑点是否正确
关键字附录参考
搜索 Fatal
搜索 uncaughtException
搜索 crashreport
搜索 Exception
搜索 Application Not Response
搜索 NetworkOnMainThreadException
搜索 ANR Warning
搜索 AnrManager
搜索 Anr in
13种常见进程死亡原因
-
java层的崩溃
- 通过java层logcat看是否崩溃(crashHandler或者调试版logcat)
- 如果java层没有任何相关日志打印就从c层看(在bugreport.zip->FS->data->tombstones->对应时间的日志)
-
低内存原因
- 搜索关键字lowmemorykiller
- 导出内存日
-
被其他进程杀死
- Android11我们可以通过在bugreport日志文件里面搜索Historical Process Exit for关键字,就能看到自己的进程被谁杀死。
-
进程已经不活动了被系统杀
- 搜索关键字empty for
06-10 13:32:13.057 1000 1700 1812 I am_kill : [0,2409,com.miui.screenrecorder,955,empty for 1800s]