理论教育 ServiceManager服务的优化

ServiceManager服务的优化

时间:2023-06-19 理论教育 版权反馈
【摘要】:Service Manager在Binder机制中既充当保护进程的角色,同时它也充当着Server角色,但是它又与一般的Server不一样。对于普通的Server来说,Client如果想要获得Server的远程接口,必须通过Service Manager远程接口提供的getService接口来获得,这本身就是一个使用Binder机制来进行进程间通信的过程。获取Service Manager远程接口的函数是defaultServiceManager(),此函数在文件frameworks/base/include/binder/IServiceManager.h中声明,具体代码如下。类IServiceManager继承了类IInterface,而类IInterface和类BpRefBase又分别继承了类RefBase。

ServiceManager服务的优化

Service Manager在Binder机制中既充当保护进程的角色,同时它也充当着Server角色,但是它又与一般的Server不一样。对于普通的Server来说,Client如果想要获得Server的远程接口,必须通过Service Manager远程接口提供的getService接口来获得,这本身就是一个使用Binder机制来进行进程间通信的过程。而对于Service Manager这个Server来说,Client如果想要获得Service Manager远程接口,却不必通过进程间通信机制来获得,因为Service Manager远程接口是一个特殊的Binder引用,它的引用句柄一定是0。

获取Service Manager远程接口的函数是defaultServiceManager(),此函数在文件frameworks/base/include/binder/IServiceManager.h中声明,具体代码如下。

函数defaultServiceManager()在文件frameworks/base/libs/binder/IServiceManager.cpp中实现,具体代码如下。

其中gDefaultServiceManagerLock和gDefaultServiceManager是全局变量,在文件frameworks/base/libs/binder/Static.cpp中定义,具体代码如下。

从上述函数可以看出,gDefaultServiceManager是单例模式,在调用函数defaultService Manager()时,如果已经创建gDefaultServiceManager了则直接返回,否则通过函数interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL))创建一个,并保存在全局变量gDefaultServiceManager中。

在Binder机制中,类BpServiceManager继承了类BpInterface<IServiceManager>,BpInterface是一个模板类,在文件frameworks/base/include/binder/IInterface.h中定义,具体代码如下。

类IServiceManager继承了类IInterface,而类IInterface和类BpRefBase又分别继承了类RefBase。

下面是创建Service Manager远程接口的主要代码:

在上述代码中,首先调用了ProcessState的静态成员函数ProcessState::self,此函数的功能是返回一个全局唯一的ProcessState实例变量,其实这就是单例模式,此变量名为gProcess。如果未创建gProcess则执行创建操作。在ProcessState的构造函数中,通过文件操作函数open()打开设备文件“/dev/binder”,并且返回来的设备文件描述符保存在成员变量mDriverFD中。(www.daowen.com)

接着调用函数gProcess->getContextObject()获得一个句柄值为0的Binder引用BpBinder。再来看函数interface_cast<IServiceManager>的具体实现,此模板函数在文件framework/base/include/binder/IInterface.h中定义,具体实现代码如下。

在上述代码中,INTERFACE接口函数是IServiceManager,在里面又调用了函数IServiceManager::as Interface()。函数IServiceManager::asInterface()是通过DECLARE_META_INTERFACE(Service Manager)宏在类IServiceManager中声明的,它位于文件framework/base/include/binder/IService Manager.h中,展开后的代码如下。

IServiceManager::asInterface是通过宏IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.IServiceManager")定义的,它位于文件framework/base/libs/binder/IServiceManager.cpp中,展开后的代码如下。

IServiceManager::asInterface的具体实现代码如下:

此处传进来的参数obj就是使用new关键字创建的BpBinder(0),类BpBinder中的成员函数queryLocalInterface()继承自基类IBinder,函数IBinder::queryLocalInterface()位于文件framework/base/libs/binder/Binder.cpp中,具体实现代码如下。

由此可见,在函数IServiceManager::asInterface()中会调用下面的语句:

即:

创建的Service Manager远程接口本质上是一个BpServiceManager,包含了一个句柄值为0的Binder引用。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈