#init.rc
service servicemanager /system/bin/servicemanager
class core
user system
group system
critical
onrestart restart healthd
onrestart restart zygote
onrestart restart media
onrestart restart surfaceflinger
onrestart restart drm
可以看到,当 ServiceManager 发生问题重启时,其他 healthd、zygote、media 等服务也会被重启。ServiceManager 服务启动后会执行 service_manager.c 的 main 函数,关键代码如下:
//frameworks/native/cmds/servicemanager/service_manager.c
int main(){
bs = binder_open(128*1024);
if (binder_become_context_manager(bs)) {
…
}
…
binder_loop(bs, svcmgr_handler);
return 0;
}
其中三个函数对应了 ServiceManager 初始化的三个关键工作:
- binder_open():打开 binder 驱动并映射内存块大小为 128KB
- binder_become_context_manager():将自己设置为 Binder “DNS” 管理者
- binder_loop():进入循环,等待 binder 驱动发来消息
下面分别来分析这三个函数&#x