servicemanager 本身在做什么?——10 步快览
| 顺序 | 代码/行为 | 说明 |
|---|---|---|
| 1 | init fork-exec /system/bin/servicemanager |
权限:user system、group system,标记 critical,若反复崩溃系统会重启 |
| 2 | 进程 main() 打开 /dev/binder |
获得 Binder 驱动 FD |
| 3 | ioctl(fd, BINDER_SET_CONTEXT_MGR, 0) |
把自己注册成 Binder Context Manager(“0 号服务”)(Android Go Source) |
| 4 | 创建 Binder 线程池、Looper | 为后续事务收发做准备 |
| 5 | 初始化内部哈希表 ServiceTable |
用于存放 名字→Binder 引用 |
| 6 | SetProperty("servicemanager.ready","true") |
通知世界“我就绪了”,客户端 IServiceManager.cpp 会轮询等这个属性(Android Go Source, Android Go Source) |
| 7 | 进入 binder_loop(handle_transaction) |
死循环等待事务 |
| 8 | 处理四大指令 | ADD_SERVICE、GET_SERVICE、CHECK_SERVICE、LIST_SERVICES |
| 9 | 监听服务死亡通知 | 当被注册的服务进程死掉,发送 binder::Status::linkToDeath 回调给使用者 |
| 10 | 停不下来的守护 | 标记 critical;若 4 分钟内崩 4 次以上,init 会触发 reboot,保证系统一致性 |

servicemanager = Binder 世界的“户籍处”:必须在 zygote 之前建好档案柜,否则 Java 世界注册 / 查询系统服务全都会因“查无此人”而失败。
servicemanager.rc 代码
servicemanager 的启动位置:
frameworks/native/cmds/servicemanager/servicemanager.rc :
service servicemanager /system/bin/servicemanager
class core animation
user system
group system readproc
critical
file /dev/kmsg w
onrestart setprop servicemanager.ready false
onrestart restart --only-if-running apexd
onrestart restart audioserver
onrestart restart gatekeeperd
onrestart class_restart --only-enabled main
onrestart class_restart --only-enabled hal
onrestart class_restart --only-enabled early_hal
task_profiles ProcessCapacityHigh
shutdown critical
这个代码块定义了核心的 servicemanager 进程应该如何被 init 系统管理。
-
service servicemanager /system/bin/servicemanagerservice: 这个关键字标志着一个服务定义块的开始。servicemanager: 这是在init系统内部赋予该服务的名称。.rc文件的其他部分将使用这个名称来控制该服务(例如start servicemanager)。servicemanager通常指 Android Binder 机制的服务注册和查询中心。/system/bin/servicemanager: 这是init启动此服务时将要运行的可执行文件的完整路径。这个二进制文件包含了servicemanager的实际代码。
-
class core animationclass: 指定该服务所属的类。类用于将相关服务分组,以便于管理(例如,一次性启动或停止某个类中的所有服务)。core animation: 将此服务同时分配给core类(通常是系统启动早期所需的核心服务)和animation类(可能与图形/显示栈相关的服务)。
-
user systemuser: 指定servicemanager进程在被init(初始以 root 身份运行)启动后,应该以哪个用户账户运行。system: 该进程将以system用户(UID 通常为 1000)的身份运行,这限制了其权限,使其低于 root 权限。
-
group system readprocgroup: 指定servicemanager进程应该在哪个用户组下运行。system readproc: 该进程的主用户组将是system(GID 通常为 1000),并且它也将属于readproc这个附加组。readproc组很可能授予了从/proc文件系统读取进程信息的权限。
-
criticalcritical: 这是一个选项,标记该服务对于系统的基本运行(尤其是在启动期间)至关重要。如果一个标记为critical的服务在启动初期反复崩溃,init可能会触发设备重启进入 recovery(恢复)模式,以防启动循环。它也影响关闭顺序(关键服务通常在后面关闭)。
-
file /dev/kmsg wfile: 这个选项与文件描述符有关。/dev/kmsg: 指定内核消息缓冲区设备。w: 表示写入(write)权限。这行代码很可能是为了确保servicemanager进程启动时拥有一个可用于写入内核日志 (/dev/kmsg) 的文件描述符,以便在标准日志系统尚未就绪时也能直接记录关键错误。
-
onrestart setprop servicemanager.ready falseonrestart: 定义了当servicemanager进程崩溃并被init自动重启时,init应该执行的命令。setprop servicemanager.ready false: 这个命令设置名为servicemanager.ready的 Android 系统属性,值为false。这可能是向系统的其他部分发出信号,表明 servicemanager 在重启期间暂时不可用。
-
onrestart restart --only-if-running apexdonrestart:servicemanager重启时执行的另一条命令。restart --only-if-running apexd: 告诉init重启名为apexd的服务,但--only-if-running标志确保仅当apexd在servicemanager崩溃时确实在运行时才尝试重启。这用于处理依赖关系;apexd很可能依赖于servicemanager。
-
onrestart restart audioserveronrestart:servicemanager重启时执行的另一条命令。restart audioserver: 告诉init重启audioserver服务,表明存在另一个依赖关系。
-
onrestart restart gatekeeperdonrestart:servicemanager重启时执行的另一条命令。restart gatekeeperd: 告诉init重启gatekeeperd服务,表明存在另一个依赖关系。
-
onrestart class_restart --only-enabled mainonrestart:servicemanager重启时执行的另一条命令。class_restart --only-enabled main: 告诉init重启所有属于main类的服务,但--only-enabled标志表示仅重启那些当前被标记为“已启用”的服务。这是一个更广泛的重启动作,针对可能受servicemanager崩溃影响的服务。
-
onrestart class_restart --only-enabled halonrestart:servicemanager重启时执行的另一条命令。class_restart --only-enabled hal: 告诉init重启所有属于hal(硬件抽象层)类的已启用服务。HAL 服务通常严重依赖servicemanager进行注册和发现。
-
onrestart class_restart --only-enabled early_halonrestart:servicemanager重启时执行的另一条命令。class_restart --only-enabled early_hal: 告诉init重启所有属于early_hal类的已启用服务。
-
task_profiles ProcessCapacityHightask_profiles: 一个选项,用于将特定的调度策略和资源分配配置文件(通常在task_profiles.json等文件中定义)应用到此服务的进程。ProcessCapacityHigh: 要应用的配置文件的名称。这很可能给予servicemanager更高的 CPU 优先级或保证其获得足够的 CPU 资源,反映其作为核心 Binder 服务注册中心的重要性。
-
shutdown criticalshutdown: 一个选项,指定该服务在设备关机期间的行为。critical: 与启动时的critical选项类似,这确保该服务在设备关机过程中被优先处理(通常关闭得较晚,并可能给予更多时间来完成清理工作)。
总而言之,这个代码块详细指示 init 进程如何启动和管理 /system/bin/servicemanager:以 system 用户/组身份运行,标记为关键服务,赋予特定权限,应用性能配置,并定义了一套详细的恢复机制(主要是重启依赖服务),以应对其意外崩溃和重启的情况。