Skip to content

anr-mechanism-demo ​

1. 实验目标 ​

用最小 Android 实现触发并诊断 ANR(对应 docs/01-runtime-concurrency/16):

  • ANR 本质:主线程 Input / Broadcast / Service 超时(约 5s / 10s / 20s)
  • 触发:主线程 sleep 6 秒 → Input 事件 5 秒无人处理 → 系统弹"应用无响应"
  • 诊断:dumpsys / /data/anr/traces.txt 看 main 线程堆栈

2. 工程要点 ​

  • 按钮点击后主线程 busy-wait 6 秒(模拟等锁 / IO / 重计算占死主线程)
  • 触发后系统弹出 ANR 对话框(预期现象,可点"等待"恢复)
  • README 提供 adb 诊断命令

3. 运行方式 ​

bash
cd labs/android/host
./gradlew installDebug

设备/模拟器打开 Android Host → 打开 ANR 触发与诊断实验室 → 点击"触发 ANR"。

ANR 发生后诊断:

bash
# 看最近一次 ANR 信息
adb shell dumpsys activity processes | grep -A 20 "ANR"
# 或直接拉 ANR traces(需要 root 或 bugreport)
adb bugreport

4. 预期现象 ​

  • 点击按钮后界面卡住约 6 秒
  • 约 5 秒时系统弹出"xxx 无响应"对话框(ANR 触发成功)
  • 选择"等待"后日志继续输出"阻塞结束"

5. 常见误区 ​

误区实际情况
ANR 只在 Input 卡顿时发生还有 Broadcast 超时(10s)与 Service 超时(20s)
子线程卡不会 ANRANR 只看主线程;子线程阻塞会间接把主线程等死(如 Future.get())
ANR 一定弹窗某些后台场景(如服务超时)不弹窗,只记日志 + 杀进程

6. 对应知识库文档 ​

7. 关键源码 ​

站点构建时间:2026/8/24 23:43:17