4. dumpsys activity services:查看所有运行的服务
在Binder调试中,dumpsys activity services 是查看Android系统当前所有运行中Service的核心命令。它直接输出ServiceManager中注册的服务列表,以及每个服务的进程信息、包名、绑定状态等关键调试数据。本节将详细解析该命令的输出格式,帮助你快速定位目标服务。
4.1 命令基础与输出概览
执行以下命令即可获取当前系统中所有正在运行的服务信息:
adb shell dumpsys activity services
输出内容通常非常庞大,包含数百个服务条目。每个服务条目以 ServiceRecord 开头,结构如下:
ServiceRecord{xxx u0 com.example.app/.MyService}
intent={act=android.intent.action.MAIN}
packageName=com.example.app
processName=com.example.app
pid=12345
uid=10123
app=ProcessRecord{yyy 12345:com.example.app/u0a123}
isForeground=false
createTime=1234567890
调试提示:如果只想查看特定包名的服务,可以配合grep过滤:
dumpsys activity services | grep -A 20 "com.example",这样能快速聚焦目标服务。
4.2 关键字段详解
输出中的每个字段都对应着Service在AMS(ActivityManagerService)中的内部状态。下表列出了最常用的调试字段及其含义:
| 字段 | 示例值 | 含义与调试价值 |
|---|---|---|
| ServiceRecord{xxx} | ServiceRecord{abc123} | 服务的唯一标识哈希值,用于在dumpsys中区分不同服务实例 |
| pid | 12345 | 服务所在进程的PID。如果为-1,表示服务尚未启动或已死亡 |
| processName | com.example.app | 服务运行所在的进程名,通常与包名相同,但也可通过android:process指定为其他进程 |
| packageName | com.example.app | 服务所属的APK包名,用于定位应用来源 |
| uid | 10123 | 服务进程的用户ID,用于权限和沙箱隔离检查 |
| app | ProcessRecord{yyy 12345} | 关联的ProcessRecord对象,包含进程的完整状态(如是否被杀死、是否处于后台等) |
| isForeground | false | 服务是否以前台方式运行(即调用了startForeground),影响进程优先级 |
| createTime | 1234567890 | 服务创建时的时间戳(系统启动后的毫秒数),用于判断服务是否刚重启 |
实战要点:当服务出现Binder调用超时或ANR时,首先检查pid是否为-1。如果pid为-1,说明服务进程已经死亡,Binder代理端会收到DeadObjectException。此时需要进一步查看app字段中的ProcessRecord状态,确认进程是被系统杀死还是主动崩溃。
4.3 进程、包名与服务的三角关系
理解 pid、processName 和 packageName 三者的关系,是分析服务调用链路的基础。一个进程可以运行多个服务,一个包名可以包含多个进程。下图展示了这种映射关系:
4.4 实战:从dumpsys输出中提取关键信息
假设你正在调试一个远程服务调用问题,服务端进程频繁重启。通过 dumpsys activity services 可以快速定位问题根源。以下是一个典型调试流程:
- 获取完整服务列表:执行
dumpsys activity services > services.txt保存输出。 - 搜索目标服务:使用
grep -n "com.example.remote/.RemoteService" services.txt定位行号。 - 查看上下文:使用
sed -n '100,130p' services.txt查看该服务前后20行。 - 检查pid状态:如果pid为-1,说明服务进程已死,需要进一步查看
app=ProcessRecord{...}中的状态字段。 - 关联进程信息:通过pid(如果存在)执行
dumpsys activity processes | grep "pid 12345"查看进程的详细状态。
常见陷阱:不要只依赖pid判断服务是否存活。有时pid存在但服务已经处于“死亡”状态(例如进程被kill但未完全清理)。此时需要检查
app 字段中的 killed 或 crashing 标志位。完整的服务状态判断应结合 ServiceRecord 和 ProcessRecord 两个对象的信息。
4.5 字段速查表
为了便于日常调试,下表汇总了 dumpsys activity services 输出中所有常见字段及其调试用途:
| 字段路径 | 调试用途 | 异常值含义 |
|---|---|---|
| ServiceRecord{hash} | 唯一标识,用于跨dumpsys关联 | hash变化表示服务被重建 |
| intent | 查看服务启动的Intent Filter | 空表示隐式启动失败 |
| packageName | 定位APK来源 | 与预期不符时检查Manifest |
| processName | 确认服务运行进程 | 与packageName不同时检查android:process |
| pid | 进程存活状态 | -1表示进程死亡 |
| uid | 权限隔离检查 | 不同uid间Binder调用需跨进程 |
| app | 进程完整状态 | 包含killed/crashing/notResponding等标志 |
| isForeground | 进程优先级判断 | false时进程可能被LMK杀死 |
| createTime | 服务生命周期分析 | 频繁重置表示服务反复重启 |
掌握这些字段后,你就能从 dumpsys activity services 的原始输出中快速提取出调试所需的核心信息,为后续分析Binder调用链路打下坚实基础。