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。