上一篇写完了servicemanager进程,其主要功能1. 注册服务(addService) 2. 获取服务(getService),并且通过一个链表来维护当前已经注册的service组件。接下来的分析,将进入binder的框架的世界,首先来分析下IServiceManager接口,注册服务和获取服务都是从这里开始的。
在介绍IServiceManager接口之前,先看下系统进程mediaserver中运行的服务,main_mediaserver.cpp 的main函数
int main(int argc __unused, char** argv)
{
//这里只看重点内容,其他不相关代码省略
if (doLog && (childPid = fork()) != 0) {
} else {
// all other services
if (doLog) {
prctl(PR_SET_PDEATHSIG, SIGKILL); // if parent media.log dies before me, kill me also
setpgid(0, 0); // but if I die first, don't kill my parent
}
InitializeIcuOrDie();
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate(); //将MediaPlayService服务注册到ServiceManager中
ResourceManagerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
SoundTriggerHwService::instantiate();
RadioService::instantiate(); //上面这些服务都是通过IServieManager接口,注册到ServiceManager的
registerExtensions();
ProcessState::self()->startThreadPool(); //接下来这两句代码,也是重量级的,没有他们,都是白搭
IPCThreadState::self()->joinThreadPool();
}
}
大家都知道,Native层的很多服务都是运行在mediaserver进程中的(Android 7.0 之后,很多服务就运行在其独立的进程了,比如ICameraService,就单独运行在cameraserver进程中了)。但是上面好像并没有出现sm->addService(serviceName)之类的语句,那是因为有BinderService,这个一个模板类,对service组件进行注册。
下面截取BinderService的注册服务的关键代码
template<typename SERVICE>
class BinderService
{
public:
static status_t