Appearance
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 bugreport4. 预期现象
- 点击按钮后界面卡住约 6 秒
- 约 5 秒时系统弹出"xxx 无响应"对话框(ANR 触发成功)
- 选择"等待"后日志继续输出"阻塞结束"
5. 常见误区
| 误区 | 实际情况 |
|---|---|
| ANR 只在 Input 卡顿时发生 | 还有 Broadcast 超时(10s)与 Service 超时(20s) |
| 子线程卡不会 ANR | ANR 只看主线程;子线程阻塞会间接把主线程等死(如 Future.get()) |
| ANR 一定弹窗 | 某些后台场景(如服务超时)不弹窗,只记日志 + 杀进程 |
6. 对应知识库文档
- 理论主文档:Android ANR 触发机制、排障定位与防范