Android 中 SystemServiceManager 和 ServiceManager 的应用场景、区别与联系
一、核心概念与应用场景
1. ServiceManager
定位:Binder 机制的核心守护进程,全局服务注册中心。
应用场景:
服务注册:系统服务(如 AMS、PMS)启动时将自身 Binder 对象注册到 ServiceManager。
服务查询:App 或组件通过服务名(如
activity
)查询并获取 Binder 代理,实现 IPC。权限管控:仅系统级进程可注册服务,普通 App 仅限查询。
工作流程:
2. SystemServiceManager
定位:SystemServer 进程内部的服务生命周期管理器,负责系统服务的创建、启动与依赖管理。
应用场景:
启动系统服务:在 SystemServer 进程中按顺序初始化 AMS、PMS、WMS 等服务。
管理生命周期:调用服务的
onStart()
,onBootPhase()
等方法,处理依赖关系。仅限 SystemServer:不对外暴露,开发者无需直接交互。
工作流程:
二、关键区别与联系
1. 核心区别
维度 | ServiceManager | SystemServiceManager |
---|---|---|
定位 | 全局 Binder 服务注册中心 | SystemServer 内部服务生命周期管理器 |
进程归属 | 独立进程(由 init 启动) | SystemServer 进程内部组件 |
功能 | 服务注册、查询、IPC 中介 | 服务创建、启动顺序控制、依赖管理 |
开发者交互 | 通过 getSystemService() 间接使用 | 仅系统启动阶段使用,不对外暴露 |
数据存储 | 维护 svclist 服务名-Binder 映射表 | 管理 SystemService 子类实例集合 |
2. 联系与协作
启动顺序依赖:
ServiceManager 最先启动:由 init 进程通过
init.rc
启动,早于 Zygote 和 SystemServer。SystemServer 依赖 ServiceManager:SystemServer 启动后,将自身服务(如 AMS)注册到 ServiceManager:
// SystemServer 中注册服务 publishBinderService("activity", new ActivityManagerService());
协同完成服务暴露:
Step 1:
SystemServiceManager
在 SystemServer 内创建并启动 AMS。Step 2:SystemServer 将 AMS 的 Binder 对象注册到
ServiceManager
。Step 3:App 通过
ServiceManager
查询 AMS 的 Binder 代理。
三、回答总结
问题:解释 SystemServiceManager
和 ServiceManager
的区别与联系。
区别:
(1)ServiceManager 是独立进程,作为全局 Binder 服务的“黄页”,负责服务的注册与查询(如 AMS、PMS)。其 Handle 值固定为 0,是 IPC 通信的中枢。
(2)SystemServiceManager 是 SystemServer 进程内的组件,充当系统服务的“孵化器”,负责创建服务对象(如new ActivityManagerService()
)、管理启动顺序及生命周期方法(如onStart()
)。联系:
(1)SystemServer 启动时,由SystemServiceManager
初始化 AMS 等核心服务;
(2)SystemServer 将这些服务注册到ServiceManager
,供其他进程查询使用。类比:
SystemServiceManager
像汽车工厂(生产并组装零件)。
ServiceManager
像交通管理局(登记车辆号牌,供他人查询)。