先把结论放在前面:ANR 不是"卡了就算",而是系统在一个特定条件下做出的判定——某个组件在规定时间内没有完成系统要求的动作。判定权在ActivityManagerService,依据是四类超时阈值加上被阻塞组件的类型;应用侧拿到的ApplicationNotRespondingDialog只是系统告知用户后的结果,真正的处理入口是ApplicationNotRespondingHandler与 traces 采集。
面试里这题属于"高频实战题"。答得浅的是"ANR 就是主线程卡了超过 5 秒";答得深的是能说清广播、输入、Service、BroadcastReceiver 四类场景各自的阈值,指出 broadcast 超时在部分版本是 10 秒与 60 秒两档,讲得清 traces 文件的结构与CPU: xx% user + yy% sys的解读方式,以及ApplicationExitInfo这条新链路。
四类超时阈值
ANR 的阈值定义在系统侧,不同 Android 版本略有差异。理解这四类是答题的基础:
| 场景 | 典型阈值 | 判定条件 | 说明 |
|---|---|---|---|
| 输入事件无响应 | 5 秒 | 按 |