一、ServiceManager的核心职责
ServiceManager 是 Android 系统中一个特殊的 Native 进程,它是 Binder 机制的“服务注册与查询中心” 。它的存在,为 Binder 跨进程通信提供了统一的命名空间和管理机制。
- 服务注册中心:所有系统服务(如
AMS、WMS)在启动后,都会通过Binder向ServiceManager注册自己。 - 服务查询入口:App 或其他进程需要调用系统服务时,必须首先通过
ServiceManager查询到该服务。 Binder上下文管理者:ServiceManager是Binder驱动的上下文管理者(Context Manager) 。它为Binder驱动提供了服务注册表,确保服务通信有序。
二、ServiceManager的启动流程
ServiceManager 的启动是 Android 系统启动的关键环节之一。
init进程启动:设备启动后,Linux 内核启动init进程。init进程是所有用户进程的父进程。init.rc脚本:init进程会读取init.rc脚本。脚本中的service servicemanager配置,告诉init进程在系统启动时拉起ServiceManager。- 打开
Binder驱动:ServiceManager启动后,会打开/dev/binder设备文件,建立与Binder驱动的连接。 - 成为
Context Manager:ServiceManager通过一个特殊的ioctl命令BINDER_SET_CONTEXT_MGR,告诉Binder驱动:我将成为Binder的上下文管理者。
三、ServiceManager的工作机制
ServiceManager 启动后,会进入一个无限循环,等待并处理来自其他进程的请求。
addService:系统服务(如ActivityManagerService)启动后,会调用ServiceManager的addService方法。ServiceManager随后会将服务名称和Binder引用存储到其内部的映射表中。getService:当一个 App 需要调用系统服务时,它会通过Binder调用ServiceManager的getService方法。ServiceManager会在映射表中查找对应的服务,并返回其Binder引用。- 句柄与引用:
ServiceManager内部维护的是一个Name-to-Binder的映射表。它通过一个整数Handle来唯一标识一个Binder服务。当客户端通过getService查询服务时,它会得到这个Handle,从而获得服务的Binder引用。
四、ServiceManager与SystemServer的协同
-
启动顺序:ServiceManager -> Zygote -> SystemServer。
-
分工合作:
- ServiceManager:负责管理服务的注册表,处理跨进程的查找和注册请求。
- SystemServer:负责启动所有的核心系统服务,并将这些服务的
Binder引用注册到ServiceManager。
结论:
ServiceManager 是 Android Binder 框架的核心服务中枢。它通过集中管理服务注册表,为 Binder 跨进程通信提供了统一的命名空间和管理机制,是 Android 系统稳定运行的基石。