ServiceManager源码流程

ServiceManager启动于单独的进程,要早于zygote启动,启动时首先运行到service_manager.c的main函数,对binder进行初始化并进入binderloop

int main(int argc, char **argv){
	bs = binder_open(128*1024);
	binder_become_context_manager(bs);
	
	binder_loop(bs, svcmgr_handler);
}

binder_open函数定义在binder.c中,打开了binder驱动并进行内存映射

bs->fd = open("/dev/binder", O_RDWR);
bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);

binder_become_context_manager同样定义在binder.c中,是向驱动注册0号节点成为manager

ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);

binder_loop也是定义在binder.c中,是一个死循环,通过ioctl监听binder调用,如果有消息,进行解析

res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
res = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func);

binder_loop中传入的svcmgr_handler是一个函数指针(回调),经过一层一层传递,传递到binder_parse最后一个参数func,在binder_parse中,根据binder命令对func进行回调

int binder_parse(struct binder_state *bs, struct binder_io *bio,uintptr_t ptr, size_t size, binder_handler func){
	switch(cmd){
		case BR_TRANSACTION:
			res = func(bs, txn, &msg, &reply);  
			binder_send_reply(bs, &reply, txn->data.ptr.buffer, res);
			break;
		}
}

svcmgr_handler在service_manager.c中,根据不同的命令码对查找或添加服务进行操作

int svcmgr_handler(struct binder_state *bs,struct binder_transaction_data *txn,struct binder_io *msg,struct binder_io *reply){
	case SVC_MGR_GET_SERVICE:
	case SVC_MGR_CHECK_SERVICE:
		// 拿到服务名字
		s = bio_get_string16(msg, &len);  
		// 查找拿到节点
		handle = do_find_service(bs, s, len, txn->sender_euid, txn->sender_pid); 
		 // 通过binder回复结果
		bio_put_ref(reply, handle);
		break;

	case SVC_MGR_ADD_SERVICE:
		s = bio_get_string16(msg, &len);
		// 添加service
		do_add_service(bs, s, len, handle, txn->sender_euid,allow_isolated, txn->sender_pid);
		break;

	case SVC_MGR_LIST_SERVICES:
		// 遍历
		svc_can_list(txn->sender_pid)
		// 打印
		bio_put_string16(reply, si->name);
		break;
}

do_find_service函数内部调用find_svc对svclist进行遍历,找到名字相同的进行返回

for (si = svclist; si; si = si->next) {
        if ((len == si->len) &&
            !memcmp(s16, si->name, len * sizeof(uint16_t))) {
            return si;
        }
    }

do_add_service同样调用find_svc对svclist进行遍历,如果没有找到,就添加一个节点

si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t));
// 经过一系列参数设置,添加进来
si->next = svclist;
svclist = si;

C层次的ServiceManager大概流程就是这样,接下来看java层的ServiceManager,这个类主要是getService方法

IBinder service = sCache.get(name);
if (service != null) {
    return service;
} else {
	return getIServiceManager().getService(name);
}

如果缓存中有要查询的binder,就直接返回,否则就调用native的servicemanager进行查询,这里是用binder进行查询的,首先获得ServiceManager的binder,在调用Service_manager.c的方法进行查询,添加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ServiceManager 是 Android 系统中的一个系统服务,它负责管理系统中所有的服务。它使用 Binder 机制来实现跨进程的服务管理。在 Android 中,所有的服务都是通过 ServiceManager 来进行注册和获取的,这也就是为什么我们可以在不同的应用程序中获取同一个服务的原因。 ServiceManager源码位于 frameworks/native/cmds/servicemanager 中,它主要由以下几个文件组成: - ServiceManager.cpp:ServiceManager 的主要实现文件,包含了 ServiceManager 类的定义和实现。 - BpServiceManager.cpp:BpServiceManagerServiceManager 的客户端代理类,它通过 Binder 机制与 ServiceManager 进行通信。 - IServiceManager.cpp:IServiceManagerServiceManager 的接口文件,定义了与 ServiceManager 相关的所有方法。 - IServiceManager.h:IServiceManager 的头文件,定义了 IServiceManager 接口类的定义。 - ServiceManager.h:ServiceManager 的头文件,包含了 ServiceManager 类的定义和一些宏定义。 ServiceManager 的主要实现是在 ServiceManager.cpp 文件中的 ServiceManager 类中。ServiceManager 类主要实现了 IServiceManager 接口类中的所有方法,包括: - addService:用于添加一个服务到 ServiceManager 中,并将服务的名字和服务的 Binder 对象映射起来。 - getService:用于获取一个已注册的服务。 - checkService:用于检查一个服务是否已经注册。 - listServices:用于列出所有已经注册的服务。 ServiceManager 的初始化是在 init_service_manager 函数中完成的,它主要完成了以下几个步骤: - 创建一个 ServiceManager 对象,并将其注册为系统服务。 - 注册系统服务,包括 Package Manager Service、Activity Manager Service、Window Manager Service 等。 - 注册其他系统服务。 总之,ServiceManager 是 Android 系统中非常重要的一个系统服务,它是整个系统中所有服务的管理者。通过 ServiceManager,我们可以方便地获取到系统中已经注册的服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值