Framework源码分析 启动流程 ServiceManager的初始化
ServiceManager
ServiceManager是Android系统中非常重要的一个守护进程,因为是0号binder,负责整个binder的查询,注册,获取。所以也是binder体系的核心。
ServiceManager的启动
ServiceManager由init进程读取init.rc启动
[init.rc]
on init
# 省去和主题无关的内容
# Start essential services
start servicemanager
start hwservicemanager
start vndservicemanager在init.rc文件中,在init阶段会启动servicemanager, 但是在init.rc文件里没有servicemanager这个service的定义。原来AndroidX里将各个daemon的定义都分成了不同的文件。servicemanager的定义是在frameworks/native/cmds/servicemanager/servicemanager.rc里
[frameworks/native/cmds/servicemanager/servicemanager.rc]
service servicemanager /system/bin/servicemanager
class core animation
user system
group system readproc
critical
onrestart restart healthd
onrestart restart zygote
onrestart restart audioserver
onrestart restart media
onrestart restart surfaceflinger
onrestart restart inputflinger
onrestart restart drm
onrestart restart cameraserver
onrestart restart keystore
onrestart restart gatekeeperd
onrestart restart thermalservice
writepid /dev/cpuset/system-background/tasks
shutdown criticalServiceManager源码分析
我们看下ServiceManager的源码
main
可以看到整个main函数很简单,主要就做了三件事: 1. 打开binder设备 2. 将自己注册为0号binder 3. 进入循环等待事件,并注册事件处理的函数svcmgr_handler
binder相关的函数分析放在binder主题中,这里就不展开了,下面看下svcmgr_handler
svcmgr_handler
svcmgr_handler主要就是负责处理接收到的指令,而ServiceManger最重要的作用就两个:查询服务和添加服务。下面我们分别看下
do_add_service
svc_can_register
svc_can_register主要检查注册权限是否满足: 1. APP不允许注册系统服务 2. 检查SELinux的权限限制
find_svc
find_svc主要就是检查本地的一个单项链表中有没有同样的服务。ServcieManager在将服务binder注册到binder驱动中的同时,在进程内部维护了一个svcinfo的单链表,用于方便查询。
do_find_service
上面分析过添加服务,这里的查找服务就简单很多了,首先通过find_svc查找到服务,如果查找到了,那再进行一些权限检查
Last updated
Was this helpful?