1. 现象识别:应用无响应弹窗、系统日志关键字、用户反馈特征

ANR(Application Not Responding)是 Android 应用最严重的卡顿形式,一旦触发系统会立即弹窗提示用户。多数初级开发者只在弹窗出现后才开始排查,忽略了更丰富的识别维度。本章聚焦现象识别,帮你建立一套从用户反馈到系统日志的多路判断规则。

1.1 ANR 无响应弹窗

当主线程阻塞超过特定阈值(通常 5s,InputDispatching 超时为 10s),系统会弹出无响应对话框,弹窗表现因 Android 版本有所差异:

Android 版本弹窗表现关键特征
5.0 / 6.0白色背景,"应用无响应" 标题,带 "确定/等待" 按钮弹窗不可取消,等待按钮仅对部分事件回滚有效
7.0 / 8.0黑色半透明背景,带应用图标,"关闭应用/等待"弹窗背景变暗,文字信息更丰富
9.0 / 10.0系统 UI 弹窗,位置居中,可查看 "详细信息"用户可主动触发 "报告" 操作生成日志
11.0+Material Design 风格弹窗,"保持等待/关闭"新增 "保持等待" 选项,避免误杀后台应用
弹窗诊断技巧: 不要只依赖弹窗本身。点击 "等待" 后如果应用恢复正常,说明阻塞事务可能已经消耗完毕;如果立即再次弹窗,说明主线程被持续阻塞,多为死循环或死锁引起。

1.2 系统日志关键关键字

即使弹窗没有出现,通过 logcat 也能提前预判 ANR。以下是必须记忆的三个日志锚点:

  • ANR in —— 标记 ANR 发生的位置,格式:ANR in com.example.app PID: 12345
  • CPU usage —— 显示 ANR 时的 CPU 状态,判断是否被其他进程耗尽 CPU
  • Delay waiting for —— 显示主线程被哪个事件阻塞(如 Input、Binder、ContentProvider)

日志样本(关键行):

2025-01-20 15:30:05.123 567-567/? E/ActivityManager: ANR in com.example.app PID: 12345
    Reason: Input dispatching timed out (Waiting to send key event because the focused window has not been finished, has been waiting for 10000.0 ms)
    CPU usage from 15860ms to 0ms ago (2025-01-20 15:29:49.263 to 15:30:05.123):
      48% 12345/com.example.app: 48% user + 0% kernel / faults: 0 minor 0 major
      0.2% 567/system_server: 0.2% user + 0% kernel / faults: 0 minor 0 major
      100% TOTAL: 48% user + 0.2% kernel + 51% idle
    DALVIK THREADS (34):
    "main" prio=5 tid=1 Waiting
      | group="main" sCount=1 dsCount=0 obj=0x75d3a440 self=0xb4b95000
      | sysTid=12345 nice=0 cgrp=default sched=0/0 handle=0xb6f4ac00
      | state=W schedstat=( 0 0 0 ) utm=0 stm=0 core=0 HZ=100
      | stack=0xbe3da000-0xbe3dc000 stackSize=8MB
      at java.lang.Object.wait(!Object.java:-1)
      at java.lang.Thread.join(Thread.java:1305)
      at android.os.AsyncTask.get(AsyncTask.java:492)
      at com.example.app.MainActivity.onClick(MainActivity.java:85)
排查规则: 看到 CPU usage 100% TOTAL: 48% user + 0.2% kernel + 51% idle 而应用本身 CPU 占比较高,说明阻塞发生在应用内部,与系统服务无关。若 system_server 的 CPU 占用高,需优先排查系统服务死锁或 Binder 调用超时。

1.3 用户反馈特征

用户不会告诉你 "ANR",他们描述的往往是具体操作现象:

典型反馈描述映射的技术问题
"点击按钮没反应,过了一会才弹窗"主线程被 Input 事件阻塞超过 5s
"滑动列表的时候画面卡住,然后黑屏了"主线程正在执行冗长的 onDraw 或 Layout
"打开页面一直在转圈,返回不了"主线程在等待网络请求或文件 I/O 结果
"正在操作 A 页面,B 页面突然跳出来并卡死"两个页面共享的 Binder 通道被持锁线程占用

避坑指南: 不要等到用户大量反馈才关注。舆情监控平台收到 3 次以上同一页面的 "卡住" 反馈,应当收集日志并开始排查。用户反馈信号往往比系统日志出现得更早,因为低端设备更容易触发 ANR。

ANR 现象识别决策树 收到应用无响应报告 ANR 弹窗类型判断 系统日志关键字扫描 用户反馈特征匹配 三路信号交叉验证 确认 ANR → 进入原因定位 疑似 ANR → 启动数据采集 注意: 弹窗、日志、用户反馈三者不需要同时满足,任一信号强烈即可进入下一步分析。 建议先检查日志关键字,再比对弹窗类型,最后结合用户复现步骤。
实战教训: 某 IM 应用在 Android 8.0 设备上频繁无响应,用户反馈 "消息发不出去但应用不崩"。通过日志关键字 Input dispatching timed out 定位到主线程在做数据库写操作,弹窗 3 次后才被用户关闭。如果团队提前建立日志关键字监控,可以减少 80% 的用户投诉。