文档详情

浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路.doc

发布:2018-06-20约5.11万字共36页下载文档
文本预览下载声明
? ? ?上一篇文章 HYPERLINK /luoshengyang/article/details/6618363 Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client、Server、Service Manager和驱动程序Binder四个组件构成。本文着重介绍组件Service Manager,它是整个Binder机制的守护进程,用来管理开发者创建的各种Server,并且向Client提供查询Server远程接口的功能。 ?? ? ? ?既然Service Manager组件是用来管理Server并且向Client提供查询Server远程接口的功能,那么,Service Manager就必然要和Server以及Client进行通信了。我们知道,Service Manger、Client和Server三者分别是运行在独立的进程当中,这样它们之间的通信也属于进程间通信了,而且也是采用Binder机制进行进程间通信,因此,Service Manager在充当Binder机制的守护进程的角色的同时,也在充当Server的角色,然而,它是一种特殊的Server,下面我们将会看到它的特殊之处。 ?? ? ? 与Service Manager相关的源代码较多,这里不会完整去分析每一行代码,主要是带着Service Manager是如何成为整个Binder机制中的守护进程这条主线来一步一步地深入分析相关源代码,包括从用户空间到内核空间的相关源代码。希望读者在阅读下面的内容之前,先阅读一下前一篇文章提到的两个参考资料 HYPERLINK /innost/archive/2011/01/09/1931456.html Android深入浅出之Binder机制和 HYPERLINK /2011/02/28/android-bnder-design/ Android Binder设计与实现,熟悉相关概念和数据结构,这有助于理解下面要分析的源代码。 ?? ? ??Service Manager在用户空间的源代码位于frameworks/base/cmds/servicemanager目录下,主要是由binder.h、binder.c和service_manager.c三个文件组成。Service Manager的入口位于service_manager.c文件中的main函数:  HYPERLINK /luoshengyang/article/details/6621566 \o view plain view plain int?main(int?argc,?char?**argv)?? {?? ????struct?binder_state?*bs;?? ????void?*svcmgr?=?BINDER_SERVICE_MANAGER;?? ?? ????bs?=?binder_open(128*1024);?? ?? ????if?(binder_become_context_manager(bs))?{?? ????????LOGE(cannot?become?context?manager?(%s)\n,??strerror(errno));?? ????????return?-1;?? ????}?? ?? ????svcmgr_handle?=?svcmgr;?? ????binder_loop(bs,?svcmgr_handler);?? ????return?0;?? }?? ?? ? ? ?main函数主要有三个功能:一是打开Binder设备文件;二是告诉Binder驱动程序自己是Binder上下文管理者,即我们前面所说的守护进程;三是进入一个无穷循环,充当Server的角色,等待Client的请求。进入这三个功能之间,先来看一下这里用到的结构体binder_state、宏BINDER_SERVICE_MANAGER的定义: ?? ? ? ?struct?binder_state定义在frameworks/base/cmds/servicemanager/binder.c文件中:  HYPERLINK /luoshengyang/article/details/6621566 \o view plain view plain struct?binder_state?? {?? ????int?fd;?? ????void?*mapped;?? ????unsigned?mapsize;?? };?? ?? ? ? ?fd是文件描述符,即表示打开的/dev/binder设备文件描述符;mapped是把设备
显示全部
相似文档