如何排查 AMS 问题
2026/8/6大约 3 分钟AMS 生命周期Android 14dumpsys activityANRActivityManagerShellCommand
如何排查 AMS 问题
“Activity 没起来”可能停在请求、启动决策、任务对象、进程创建、客户端事务或窗口显示中的 任意一段。AMS 排障的第一步不是搜一条熟悉的 logcat,而是先用当前状态确定请求走到了哪一 段,再用日志和 trace 还原它为什么停下。
状态回答“现在在哪”,日志回答“怎么到这”
| 常见误解 | 正确理解 |
|---|---|
| 先看 logcat 就能定位启动问题 | 先看“当前状态”(dumpsys activity),再用日志补“历史时序” |
| 进程被杀就是设备问题 | 先查 oom_adj 与 LMK 证据,再判断是否正常回收 |
AMS 排障和窗口排障一样:先把现象翻译成“哪个阶段”,再到对应模块取状态证据。
统一诊断链
逐步解释:
- ① 请求:确认
startActivity结果码,判断是否到达 ATMS。 - ② 决策:看 ActivityStarter 是否拒绝(后台启动限制等)。
- ③ 对象:
dumpsys activity activities找 ActivityRecord 与 Task。 - ④ 进程:
dumpsys activity processes与pidof确认进程与 attach。 - ⑤ 生命周期:日志与事务执行情况判断 onCreate/onResume 是否走到。
- ⑥ 优先级:查 oom_adj 是否异常,解释被杀原因。
症状矩阵
| 现象 | 第一证据 | 生命周期阶段 | 责任层 | 下一步验证 |
|---|---|---|---|---|
| 点图标无反应 | am start -W 输出 | 请求/决策 | ATMS + App | 看 ActivityStarter 返回码 |
| 启动慢 | am start -W 分段时间 | 进程创建 | AMS + Zygote | 对比冷/热启动 |
| Activity 没到 onResume | logcat 生命周期日志 | 生命周期事务 | ATMS + App | 检查事务执行异常 |
| 进程被杀 | dumpsys activity processes | 优先级 | AMS + LMK | 查 oom_adj 与内存 |
| ANR | dumpsys activity lastanr | 生命周期/输入 | AMS + App | 看 AnrHelper 记录 |
| 界面没显示 | window dump | 窗口衔接 | WMS 系列 | 转窗口诊断链 |
常用命令
环境:主机终端连接调试设备,目标窗口/Activity 保持在可观察状态:
adb shell dumpsys activity activities
adb shell dumpsys activity processes
adb shell dumpsys activity service com.example.demo
adb shell dumpsys activity broadcasts
adb shell am start -W -n com.example.demo/.MainActivity
adb shell pidof com.example.demo| 命令 | 观察维度 | 注意 |
|---|---|---|
dumpsys activity activities | ActivityRecord、Task、状态 | DUMP_ACTIVITIES_CMD(ATMS.java:346) |
dumpsys activity processes | 进程、adj、存活原因 | 与 LMK 证据交叉 |
am start -W | 启动分段耗时与结果码 | 冷启动与热启动分开看 |
dumpsys activity lastanr | 最近 ANR 摘要 | 由 AnrHelper 记录 |
ANR 处理入口在 AnrHelper.appNotResponding()(AnrHelper.java:117);am 命令由 ActivityManagerShellCommand(ActivityManagerShellCommand.java:160)实现。命令字段可能因厂商实现不同而变化,单一 dump 缺字段不能直接下结论。
源码入口
若 Activity 状态正常而画面、焦点或窗口层级异常,转到 WMS 排障;需要建立跨模块证据顺序时,先读 系统调试与排障。
源码基准:android-14.0.0_r75。
以下文件默认位于 frameworks/base/,表中省略该前缀:
| 文件 | 关键位置 | 作用 |
|---|---|---|
services/core/java/com/android/server/am/ActivityManagerService.java | 850 行 dump(...) | dumpsys activity 状态入口 |
services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 346 行 DUMP_ACTIVITIES_CMD = "activities" | dump 子命令 |
services/core/java/com/android/server/am/AnrHelper.java | 50 行 class AnrHelper;117 行 appNotResponding(...) | ANR 流程入口 |
services/core/java/com/android/server/am/ActivityManagerShellCommand.java | 160 行 class ActivityManagerShellCommand | am 命令入口 |