Android 14 servicemanager的前世今生
本博文在下边两个文章的基础上,增加新的不同知识点,主要是基于Andorid14。
servicemanger的前世今生--Android 12
Android 12 S ServiceManager原理 --闪闪的vlog
1 servicemanager概述
-
作用:servicemanager管理系统中所有Binder服务的注册(addService)和查找(getService),是所有Binder服务端的大管家。类似DNS服务器,通过service name返回IBinder对象。
- 启动时序:servicemanager是由init进程在on init阶段启动的,请参考on init启动基石服务servicemanager/hwservicemanager,它早于zygote启动,而zygote是在init-late之后的post-fs-data阶段启动的。
on init# Mount binderfsmkdir /dev/binderfsmount binder binder /dev/binderfs stats=globalchmod 0755 /dev/binderfssymlink /dev/binderfs/binder /dev/bindersymlink /dev/binderfs/hwbinder /dev/hwbindersymlink /dev/binderfs/vndbinder /dev/vndbinderchmod 0666 /dev/binderfs/hwbinderchmod 0666 /dev/binderfs/binderchmod 0666 /dev/binderfs/vndbinder...# Start essential services.start servicemanagerstart hwservicemanagerstart vndservicemanager
- 源码路径:android/frameworks/native/cmds/servicemanager/
2 servicemanager和hwservicemanager的区别
- servicemanager的路径在system/bin/servicemanager,用来管理AOSP系统服务,运行在System分区。
- hwservicemanager的路径在vendor/bin/hwservicemanager,用来管理HIDL或AIDL实现的HAL service。旧名字叫vndservicemanager。现在AOSP中的vndservicemanager和servicemanager使用同一个代码路径,通过参数不同而区分,主要是为了兼容Android7及以前老设备。
- 在Android8.0引入Treble架构之前,所有的系统服务和HAL服务都注册在一个servicemanager中,使得系统(System分区)和厂商(vendor分区)强耦合,Google更新系统时,必须依赖芯片厂商提供的HAL实现。
- 因此Android8.0引入Treble之后,让System和vendor分区独立升级,使用分离的Binder设备节点。servicemanager访问/dev/binder节点,负责系统服务。而hwservicemanager使用/dev/hwbinder节点,负责HAL service。
名称 | 访问的设备节点 | 角色 | 所属域 | 管理的服务 |
---|---|---|---|---|
servicemanager | /dev/binder | 系统服务管理器 | System(AOSP) | AMS、PMS、WMS 等 |
hwservicemanager | /dev/hwbinder | 供应商 HAL 服务管理器 | Vendor(HAL) | 相机、音频、传感器等 HIDL HAL |
3 Access: servicemanager的安全门卫
Access类主要是负责访问控制,定义和管理哪些进程或者用户可以注册、查询或使用系统服务。它主要根据调用者的上下文(CallingContext)和SELinux确保只有合法的进程才可以操作系统服务。