6.2 庖丁解MediaServer

为了能像“庖丁”那样解析Binder,我们必须得找一头“牛”来做解剖,而MediaServer(简称MS)正是一头比较好的“牛”。它是一个可执行程序,虽然Android的SDK提供Java层的API,但Android系统本身还是一个完整的基于Linux内核的操作系统,所以并非所有的程序都是用Java编写的,这里的MS就是一个用C++编写的可执行程序。

之所以选择MediaServer作为切入点,是因为这个Server是系统诸多重要Service的栖息地,它们包括:

AudioFlinger:音频系统中的核心服务。

AudioPolicyService:音频系统中关于音频策略的重要服务。

MediaPlayerService:多媒体系统中的重要服务。

CameraService:有关摄像/照相的重要服务。

可以看到,MS除了不涉及Surface系统外,其他重要的服务基本上都涉及了,它不愧是“庖丁”所要的好“牛”。

这里以其中的MediaPlayerService为主切入点进行分析。先来分析MediaServer本身。

6.2.1 MediaServer的入口函数

MS是一个可执行程序,入口函数是main,代码如下所示:


[—>Main_MediaServer.cpp]

int main(int argc,char**argv)

{

//①获得一个ProcessState实例。

sp<ProcessState>proc(ProcessState:self());

//②MS作为ServiceManager的客户端,需要向ServiceManager注册服务。

//调用defaultServiceManager,得到一个IServiceManager。

sp<IServiceManager>sm=defaultServiceManager();

//初始化音频系统的AudioFlinger服务。

AudioFlinger:instantiate();

//③多媒体系统的MediaPlayer服务,我们将以它作为主切入点。

MediaPlayerService:instantiate();

//CameraService服务。

CameraService:instantiate();

//音频系统的AudioPolicy服务。

AudioPolicyService:instantiate();

//④根据名称来推断,难道是要创建一个线程池吗?

ProcessState:self()->startThreadPool();

//⑤下面的操作是要将自己加入到刚才的线程池中吗?

IPCThreadState:self()->joinThreadPool();

}


上面的代码中,确定了5个关键点(即①~⑤),让我们通过对这5个关键点逐一进行深入分析,来认识和理解Binder。