ServiceManager启动Binder
在Framwork源码解析(1)_Zygote进程启动流程一文中了解过,Android系统启动Zygote进程然后创建SystemService,再创建其他服务进程,ServiceManager 进程也是在这里启动的。查看/system/core/rootdir/init.rc源码,可以找到启动servicemanager:

这里启动的是/frameworks/native/cmds/servicemanager下的service_manager.c文件,此目录下还有servicemanager.rc配置,就是被zygote启动的。
查看service_manager.c源码的main方法:
int main(int argc, char** argv){
// ......
if (argc > 1) {
driver = argv[1];
} else {
// 设置默认binder驱动文件路径
driver = "/dev/binder";
}
// 打开binder文件,并设置映射文件大小为128KB
bs = binder_open(driver, 128*1024);
// 成为上下文管理者
if (binder_become_context_manager(bs)) {
ALOGE("cannot become context manager (%s)\n", strerror(errno));
return -1;
}
// ......
// 开启binder循环
binder_loop(bs, svcmgr_handler);
return 0;
}
主要做了三件事:
- 设置默认binder驱动文件路径,root过的手机可以在/dev/binder目录下找到Binder驱动文件
- 打开binder驱动:binder_open
- 将ServiceManager注册成为 binder 服务管理者:binder_become_context_manager
- 开启binder循环:binder_loop
binder_open
找到同级目录下的frameworks/native/cmds/servicemanager/binder.c文件,该文件中找到binder_open方法:
struct binder_state *binder_open(const char* driver, size_t mapsize)
{
struct binder_state *bs;
struct binder_version vers;

本文详细介绍了Android系统中ServiceManager如何启动Binder进程。从`binder_open`、`binder_become_context_manager`到`binder_loop`,解析了每个步骤的主要功能,包括设置Binder驱动文件路径、打开驱动、注册ServiceManager为Context Manager以及开始Binder循环。通过mmap映射内存,确保与内核空间的数据交互,并阐述了128KB映射大小的原因。
最低0.47元/天 解锁文章
1211

被折叠的 条评论
为什么被折叠?



