Framework源码分析 启动流程 ServiceManager的初始化

ServiceManager

ServiceManager是Android系统中非常重要的一个守护进程,因为是0号binder,负责整个binder的查询,注册,获取。所以也是binder体系的核心。

ServiceManager的启动

ServiceManagerinit进程读取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 critical

ServiceManager源码分析

我们看下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?