第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

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”。以下为故障树:

导航应用 ANR 现象识别故障树 ANR 异常 用户交互无响应 后台组件无响应 触摸事件超时 按键事件超时 轨迹球/滚轮超时 服务超时 (20s) 广播超时 (10s) ContentProvider超时 地图手势回调阻塞 搜索输入框死锁 定位回调阻塞主线程 路况广播处理超时 导航栈溢出
(后续章节) 递归回调链
(后续章节)
Handler队列堆积
(后续章节)
现象识别阶段:仅收集用户侧表现和系统超时类型

1.4 判断规则速查表

现场排查时,可依据以下规则快速判断 ANR 是否与导航业务直接相关:

规则判断条件结论
R1用户操作后 5 s 内出现系统 ANR 对话框极大概率为输入事件超时 ANR
R2ANR 发生时地图界面卡在当前帧(Tile 未加载)主线程可能阻塞在 Tile 渲染/网络请求
R3日志中包含 InputDispatcher::notifyANR 且进程名含 navigation确认是导航进程 ANR
R4ANR 之前有连续 2 次以上 Choreographer 丢帧(> 16ms)UI 线程已接近阻塞,即将引发 ANR
R5用户无任何操作,但应用在后台自行 ANR优先排查 Service/BroadcastReceiver 超时
提示:导航应用在 “现象识别” 阶段最容易被忽略的信号是 “GPS 箭头动但地图不动” —— 这往往是 UI 线程被渲染任务卡死,而定位线程未受影响。后续第 3 章 数据采集 中会讲解如何用 systrace 和 dumpsys 捕获该场景的现场证据。

1.5 本章小结