一、服务注册的核心流程
ServiceManager 注册服务的过程,是 Android 启动时的一个关键环节。它通过一个标准的、跨进程的流程,将所有核心服务集中管理。
1. 系统服务启动
- 当
SystemServer进程启动时,它会初始化一系列核心服务,如ActivityManagerService(AMS)、PackageManagerService(PMS)等。 - 这些服务都实现了
IBinder接口,使其能够通过Binder机制进行跨进程通信。
2. 注册到ServiceManager
SystemServer随后会调用ServiceManager.addService()方法,将服务注册到ServiceManager。ServiceManager是一个特殊的Binder服务,其句柄(Handle)固定为**0**,这使得所有进程都能通过这个句柄找到它。
3. 登记服务信息
-
在
addService()调用中,SystemServer会提供两个关键信息:- 服务名:一个唯一的字符串标识符,如
"activity"。 Binder引用:服务端的IBinder对象,它是其他进程调用该服务的唯一凭证。
- 服务名:一个唯一的字符串标识符,如
二、ServiceManager的底层处理机制
ServiceManager 接收到注册请求后,会进行一系列严谨的处理。
- 权限校验:
ServiceManager会检查调用者的身份和权限。只有像SystemServer这样具备高权限的进程,才能注册核心系统服务。这是一种强大的安全机制,防止恶意服务冒充系统服务。 - 存储服务信息:
ServiceManager内部维护一个Native层的哈希表(Map<String, IBinder>)。它会将服务名作为Key,服务的Binder引用作为Value,存储起来。 - 成为
Binder上下文管理者:在ServiceManager启动时,它会向Binder驱动发送一个特殊的ioctl命令BINDER_SET_CONTEXT_MGR,告诉驱动自己将管理所有服务的注册和查询。
三、服务发现与跨进程调用
ServiceManager 不仅负责注册,更重要的是,它为服务发现提供了统一入口。
- 查询服务:当一个 App 需要调用
ActivityManagerService时,它会通过Binder调用ServiceManager的getService()方法,并传入服务名"activity"。 - 返回
Binder引用:ServiceManager在哈希表中查找"activity",并返回ActivityManagerService的Binder引用。 - 跨进程调用:App 拿到
Binder引用后,就可以通过Binder机制,直接向ActivityManagerService发送跨进程调用请求。
四、总结:ServiceManager的意义
ServiceManager 是 Android Binder 框架的核心服务中枢。它的存在,为 Binder 跨进程通信提供了统一的命名空间和管理机制,是 Android 系统稳定运行的基石。
核心价值:
- 集中管理:所有核心服务集中登记,避免散落各处。
- 服务发现:为 App 提供了一个统一、可靠的服务查找入口。
- 权限隔离:在注册和查询阶段进行权限校验,防止恶意服务破坏系统。