MediaServer中包括了系统中的许多重要的Server:
- AudioFlinger:音频系统中的核心服务
- AudioPolicyService:音频系统中关于音频策略的重要服务
- MediaPlayerService:多媒体系统中的重要服务
- CameraService:有关照相和摄像的重要服务
同时,分析MediaServer对于理解Android中的IPC机制能够提供较好的帮助。Android系统基本上可以看做是一个基于Binder机制的C/S架构,对于Binder机制的理解相对比较复杂,如果能够通过具体的例子入手会比较容易理解。
Android的通信体制架构
Android的通信机制基本上可以看做是Client、Server和ServiceManager三者之间的交互:
- Server首先要注册一些Service到ServiceManager,在这里Server是ServiceManager的客户端;
- 如果某个Client要使用Service,则首先到ServiceManager中获得该Service的相关信息,所有Client是ServiceManager的客户端;
- Client得到Service信息,然后和该Service所在的Server进程建立通信之后使用Service,在这里Client是Server的客户端。
在这些交互的过程中,Android系统都是使用的Binder来进行通信。
MediaServer入口函数
MS是一个可执行程序,它的入口函数是main函数,所在文件位置:frameworks\base\media\mediaserver\main_mediaserver.cpp
代码如下:
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
可以看到,在main函数中,
- 我们首先获得了一个ProcessState的实例,由self方法我们可以猜得到该类使用了单例模式;
- 接下来我们调用了defaultServiceManager方法获得IServiceManager实例;
- 接下来进行了几个重要服务的初始化工作;
- 调用startThreadPool方法和joinThreadPool方法。
ProcessState类的分析
文件位置:frameworks\base\libs\binder\ProcessState.cpp
self方法:在main函数中,我们调用了self方法得到了一个ProcessState实例,下面我们来看看这个方法
sp<ProcessState> ProcessState::self()
{
if (gProcess != NULL) return gProcess;
//提供原子操作
AutoMutex _l(gProcessMutex);
if (gProcess == NULL) gProcess = new ProcessState;
return gProcess;
}
可以看到,不出所料,ProcessState使用的就是单例模式。
接下来我们来看一看ProcessState的构造函数:
ProcessState::ProcessState()
: mDriverFD(open_driver())
, mVMStart(MAP_FAILED)
, mManagesContexts(false)
, mBinderContextCheckFunc(NULL)
, mBinderContextUserData(NULL)
, mThreadPoolStarted(false)
, mThreadPoolSeq(1)
{
if (mDriverFD >= 0) {
// XXX Ideally, there should be a specific define for whether we
// have mmap (or whether we could possibly have the kernel module
// availabla).