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 三者的关系,是分析服务调用链路的基础。一个进程可以运行多个服务,一个包名可以包含多个进程。下图展示了这种映射关系:

pid、processName、packageName 三角关系 packageName com.example.app processName com.example.remote pid 12345 映射规则说明: 1. 一个 packageName 可以声明多个 processName(通过 android:process 属性) 2. 一个 processName 对应唯一一个 pid(进程唯一标识) 3. 一个 pid 可以运行多个 ServiceRecord(多服务共享进程) 4. 当 pid = -1 时,processName 仍存在,但服务已不可用 5. 调试时通过 pid 可进一步查看 /proc/[pid]/status 获取进程状态

4.4 实战:从dumpsys输出中提取关键信息

假设你正在调试一个远程服务调用问题,服务端进程频繁重启。通过 dumpsys activity services 可以快速定位问题根源。以下是一个典型调试流程:

  1. 获取完整服务列表:执行 dumpsys activity services > services.txt 保存输出。
  2. 搜索目标服务:使用 grep -n "com.example.remote/.RemoteService" services.txt 定位行号。
  3. 查看上下文:使用 sed -n '100,130p' services.txt 查看该服务前后20行。
  4. 检查pid状态:如果pid为-1,说明服务进程已死,需要进一步查看 app=ProcessRecord{...} 中的状态字段。
  5. 关联进程信息:通过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调用链路打下坚实基础。