1. 概述
在一台Android 8.1的手机中,可以看到三个servicemanager:
- servicemanager,管理系统服务,本文只讨论servicemanager;
- vndservicemanager,管理厂商服务,对应的文件节点是/dev/vndbinder,servicemanager和vndservicemanager使用的是同一份代码,都是由service_manager.c编译而来;
- hwservicemanager,用于管理hidl服务,因此其实现和servicemanager完全不同,使用的binder库也完全不同。
2. 启动
/frameworks/native/cmds/servicemanager/servicemanager.rc
service servicemanager /system/bin/servicemanager
...
3. 初始化
frameworks/native/cmds/servicemanager/service_manager.c
int main(int argc, char** argv)
{
struct binder_state *bs;
union selinux_callback cb;
char *driver;
if (argc > 1) {
driver = argv[1]; //vndservicemanager启动时,传入/dev/vndbinder
} else {
driver = "/dev/binder";
}
bs = binder_open(driver, 128*1024);
if (binder_become_context_manager(bs)) {
...
}
binder_loop(bs, svcmgr_handler);
return 0;
}
3.1 binder_open@servicemanager
frameworks/native/cmds/servicemanager/binder.c
struct binder_state *binder_open(const char* driver, size_t mapsize)
{
struct binder_state *bs;
struct binder_version vers;
bs = malloc(sizeof(*bs)); -------------1
bs->fd = open(driver, O_RDWR | O_CLOEXEC); ------ 2
if ((ioctl(bs->fd, BINDER_VERSION, &vers) == -1) ||
...
}
bs->mapsize = mapsize; // 128K
bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0); ---------3
....
return bs;