1. ANR现象识别
1.1 ANR 定义与用户感知标准
ANR(Application Not Responding) 是 Android 系统在检测到应用主线程阻塞超过阈值时触发的异常。用户侧直接表现:点击屏幕无反应、界面卡死、系统弹出「应用无响应」对话框。对于导航应用而言,80% 以上的 ANR 发生在交互操作后 2–5 秒内,用户感知最强烈的场景包括:
- 地图拖拽/缩放:手指平移时画面滞后 > 0.5 s,即产生卡顿感;超过 5 s 则触发 ANR。
- 路线规划点击:点击「开始导航」后界面冻结,语音无反馈。
- 实时路况刷新:自动拉取路况时主线程被长耗时任务阻塞。
关键阈值速查
输入事件(按键/触摸)超时:5 s
广播接收器 onReceive 执行超时:10 s
服务启动/绑定超时:20 s
内容提供者超时:5 s
输入事件(按键/触摸)超时:5 s
广播接收器 onReceive 执行超时:10 s
服务启动/绑定超时:20 s
内容提供者超时:5 s
1.2 导航应用典型 ANR 表现
导航业务场景与普通 App 不同,其 ANR 常带有强烈的位置/时间特征。以下为一线排查中收集的 Top-5 现象:
| 序号 | 表现 | 用户描述 | 判断规则 |
|---|---|---|---|
| 1 | 地图画面冻结 | “画面停在路口不动,但GPS箭头还能移动” | 主线程被绘制计算或 I/O 阻塞 |
| 2 | 搜索框输入无响应 | “打字没反应,键盘弹不出来” | View.onKeyDown 超时 |
| 3 | 语音播报中断 | “正在说‘前方500米…’忽然没声音” | 音频回调在 Handler 中排队过长 |
| 4 | 交互式弹窗卡死 | “点‘避让拥堵’弹窗,一直转圈” | Dialog 绘制导致 Choreographer 丢帧 |
| 5 | 后台定位 ANR | “熄屏后再打开,显示无响应” | Service.onStartCommand 中执行了网络请求 |
⚠️ 注意:导航应用常使用
FusedLocationProviderClient + ThreadPool 进行定位回调。若回调中直接更新 UI 而忘记切回主线程,极易引发 ANR。此为后续章节 导航栈溢出 的重要诱因。
1.3 用户感知交互无响应时间模型
Android 系统采用 三次监听 + 超时引爆 机制。故障树可以帮助排查人员快速定位是属于“用户输入 ANR”还是“后台组件 ANR”。以下为故障树:
1.4 判断规则速查表
现场排查时,可依据以下规则快速判断 ANR 是否与导航业务直接相关:
| 规则 | 判断条件 | 结论 |
|---|---|---|
| R1 | 用户操作后 5 s 内出现系统 ANR 对话框 | 极大概率为输入事件超时 ANR |
| R2 | ANR 发生时地图界面卡在当前帧(Tile 未加载) | 主线程可能阻塞在 Tile 渲染/网络请求 |
| R3 | 日志中包含 InputDispatcher::notifyANR 且进程名含 navigation | 确认是导航进程 ANR |
| R4 | ANR 之前有连续 2 次以上 Choreographer 丢帧(> 16ms) | UI 线程已接近阻塞,即将引发 ANR |
| R5 | 用户无任何操作,但应用在后台自行 ANR | 优先排查 Service/BroadcastReceiver 超时 |
提示:导航应用在 “现象识别” 阶段最容易被忽略的信号是 “GPS 箭头动但地图不动” —— 这往往是 UI 线程被渲染任务卡死,而定位线程未受影响。后续第 3 章 数据采集 中会讲解如何用
systrace 和 dumpsys 捕获该场景的现场证据。