日志采集准备:开发者选项设置、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 命令,按使用频次降序列出:

  1. 实时过滤 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)"
  2. 完整 bugreport:
    adb bugreport bugreport.zip
    # 包含 CPU top、meminfo、wake lock、binder 状态、dumpsys 全量快照
  3. 获取 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/ 到可读路径
  4. dumpsys 关键快照:
    adb shell dumpsys cpuinfo
    adb shell dumpsys meminfo 
    adb shell dumpsys activity processes | grep -A 5 "lastResume"
  5. 查询日志缓冲区大小:
    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
adb logcat -b main -G 2M
adb logcat -b system -G 2M
adb logcat -b events -G 1M
偶发 ANR 长期监控 main: 4MB, system: 4MB, events: 2MB
adb logcat -b main -G 4M
adb logcat -b system -G 4M
adb logcat -b events -G 2M
低端设备(内存紧张) main: 1MB, system: 1MB, events: 512KB
adb logcat -b main -G 1M
adb logcat -b system -G 1M
adb logcat -b events -G 512K
验证调整是否生效:再次执行 adb logcat -g 即可看到新的大小。注意:若设备 root 后也可通过 persist.log.tag、logd.logpersistd.size 等属性持久化配置,但非 root 设备只能临时调整。

2.5 故障树:采集前检查清单

用一张故障树把常见的“采集失败”原因可视化,避免白忙一场:

日志采集准备故障树 采集失败 日志开关未开 日志被缓冲区覆盖 adb 权限/连接异常 “显示所有ANR” 关闭 默认 256KB 太小 设备未授权 / adb 断开 设置 → 开发者选项开启 adb logcat -G 2M 重新连接 / acp 授权 采集前务必按故障树逐项检查,三者缺一不可

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 提示可见性。

2.7 本章小结