1. 前言
上一篇文章解答了关于 servicemanager 的三个问题,其中讲到 servicemanager 作为一个特殊的 Service 组件,既负责为系统中其他的 Service 组件提供注册服务,同时又负责为 Client 组件提供获取 Service 组件代理对象的服务。那么 Service 组件和 Client 组件如何才能使用到 servicemanager 提供的服务呢?当然是通过 servicemanager 的代理对象,本文主要分析 defaultServiceManager 函数获取 servicemanager 代理对象的过程。 defaultServiceManager 函数定义如下:
代码路径:frameworks/native/libs/binder/IServiceManager.cpp
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
while (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
if (gDefaultServiceManager == NULL)
sleep(1);
}
}
return gDefaultServiceManager;
}
defaultServiceManager 函数中使用单例模式来获取 servicemanager 的代理对象,也就是说每个 Client 进程中只会存在一个 servicemanager 的代理对象。
由于全局变量 gDefaultServiceManager 用于保存 servicemanager 的代理对象,所以先判断 gDefaultServiceManager 是否为空,如果不为空则直接返回该变量,否则需要进行以下两个步骤:
1. 调用 ProcessState 的 getContextObject 函数获得一个代理对象 BpBinder,该代理对象即为 servicemanager 对应的代理对象 。
2. 调用模板函数 interface_cast 将获得的 BpBinder 进一步封装成 Client 进程易于使用的 BpServiceManager 对象。
接下来对这两个步骤的实现过程进行详细说明。
2. 获得 servicemanager 对应的代理对象 BpBinder
首先通过 ProcessState::self() 获得一个全局唯一的 ProcessState 实例,self 函数定义如下:
代码路径:frameworks/native/libs/binder/ProcessState.cpp
sp<ProcessState> ProcessState::self()
{
Mutex::Autolock _l(gProcessMutex);
if (gProcess != NULL) {
return gProcess;
}
gProcess = new ProcessState;
return gProcess;
}
</