日志采集准备:开发者选项设置、adb命令、系统日志缓冲区配置
本章定位:数据采集阶段 —— ANR 排查的第一手原始数据来自日志,而日志的完整性和时效性取决于采集前的正确配置。本环节聚焦「如何让系统愿意把细节写出来」「如何用最少的命令捞到核心数据」「如何避免因缓冲区溢出丢失关键线索」。
2.1 现象识别 → 采集准备链条
在遇到 ANR 时,先判断是否属于可复现型 vs 偶发型:
- 可复现型:可录制操作路径后设置开发者选项,执行一次即可捕获完整日志。
- 偶发型:建议长期开启必要开关,并增大缓冲区,避免漏抓。
核心原则:采集前必须确认日志开关已打开,否则 ANR 发生时可能只留下干瘪的 “ANR in xxx” 一行,无堆栈、无 CPU 使用率、无主线程运行轨迹。
2.2 开发者选项设置清单
| 设置项 | 推荐值 | 作用说明 |
|---|---|---|
| 不保留活动 | 开启 | 用户离开即销毁 Activity,模拟低内存场景,加速 ANR 触发并暴露生命周期问题 |
| 后台进程限制 | 不允许后台进程 | 强行限制进程数,使系统更早触发 ANR,同时避免无关进程干扰日志 |
| 显示所有 ANR | 开启 | 即使后台 ANR 不弹对话框,也会写入日志并显示通知 |
| 指针位置 / 触摸点显示 | 按需开启 | 排查输入事件相关 ANR 时,可协助判断事件是否被正常分发 |
| 强制 GPU 渲染 | 关闭 | 开启后会改变渲染路径,导致非真实用户场景,干扰 ANR 原因判断 |
注意:“不保留活动”和“后台进程限制”会显著改变系统行为,仅在调试环境使用,切勿在用户设备上长期开启。
2.3 adb 命令工具箱
采集 ANR 日志最核心的 5 条 adb 命令,按使用频次降序列出:
- 实时过滤 logcat:
adb logcat -b main -b system -b events -v threadtime # 通常只关注 ANR 相关 tag: ActivityManager, am_anr, InputDispatcher adb logcat -b main -b system -v threadtime | grep -E "(ANR|am_anr|InputDispatcher)" - 完整 bugreport:
adb bugreport bugreport.zip # 包含 CPU top、meminfo、wake lock、binder 状态、dumpsys 全量快照 - 获取 ANR traces:
adb shell ls /data/anr/ adb shell cat /data/anr/traces.txt > anr_traces_local.txt # 若 ANR 文件被自动压缩,先 adb root 再 adb shell cp /data/anr/ 到可读路径 - dumpsys 关键快照:
adb shell dumpsys cpuinfo adb shell dumpsys meminfoadb shell dumpsys activity processes | grep -A 5 "lastResume" - 查询日志缓冲区大小:
adb logcat -g # 输出示例: # main: ring buffer is 256Kb (256Kb consumed), max 256Kb # system: ring buffer is 256Kb (256Kb consumed), max 256Kb # events: ring buffer is 256Kb (256Kb consumed), max 256Kb
2.4 系统日志缓冲区配置
Android 有 4 个主要日志缓冲区:main(应用层)、system(系统服务)、events(事件统计)、crash(崩溃信息)。默认每个大小通常只有 256KB,ANR 发生前后 2~3 秒内的日志极易被覆盖。
调整方法:通过
adb logcat -b <buffer> -G <size> 临时调整缓冲区大小(重启后失效,适用于短期调试)。
| 场景 | 推荐缓冲区大小 | 对应命令 |
|---|---|---|
| 可复现 ANR 专抓 | main: 2MB, system: 2MB, events: 1MB | |
| 偶发 ANR 长期监控 | main: 4MB, system: 4MB, events: 2MB | |
| 低端设备(内存紧张) | main: 1MB, system: 1MB, events: 512KB | |
验证调整是否生效:再次执行
adb logcat -g 即可看到新的大小。注意:若设备 root 后也可通过 persist.log.tag、logd.logpersistd.size 等属性持久化配置,但非 root 设备只能临时调整。
2.5 故障树:采集前检查清单
用一张故障树把常见的“采集失败”原因可视化,避免白忙一场:
2.6 复测与预防建议
复测清单:
- 执行一次
adb logcat -g确认缓冲区大小已生效。 - 触发一个可复现的 ANR(例如在主线程 sleep(10)),检查
/data/anr/traces.txt是否产生、logcat 中是否出现am_anr事件。 - 检查 bugreport 内
FS/data/anr目录是否包含 traces 文件。
预防建议:在 CI 或自动化测试脚本中加入采集前检查步骤(开关状态+缓冲区大小+adb 连通性),避免因配置遗漏导致回归漏抓。重大发版前建议使用
adb shell settings put global anr_show_updates 1 增强 ANR 提示可见性。