
3.3 产生过程
在了解MediaPlayerService之前,先了解一下IMediaPlayerService.cpp,在C++ 6.0源码中其处于frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp中:

可以看出这里定义了一些常规播放控制接口,接下来开始了解MediaPlayerService,首先找到入口,在frameworks/base/media/mediaserver/main_mediaserver.cpp中:

接着看看defaultServiceManager函数,代码如下:

用的是一个单例,每个进程只需要一个BpServiceManager代理,ProcessState::self() ->getContextObject(NULL),接下来看看getContextObject(NULL)函数,看看ProcessState::self() ->getContextObject(NULL),代码如下:

总结一下上面的代码,传入的句柄handle值为0,表示ServiceManager,构建一个BpBinder,所以现在相当于gDefaultServiceManager = interface_cast(new BpBinder(0));。
接下来看看interface_cast是什么,其处于frameworks/base/include/binder/IInterface.h中:

等价于:

下面继续跟到IServiceManager里面去,其处于frameworks/base/include/binder/IServiceManager.h中:

总结一下,句柄handle(0)创建了一个new BpBinder(0),根据这个BpBinder创建一个BpServiceManager代理。
下面来分析BpServiceManager,代码如下:

这里的BpInterface是一个模板类,表示BpServiceManager同时继承于BpInterface和IServiceManager类:

调用了基类BpInterface的构造函数:

开始添加服务内部,在frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp中,有一个instantiate函数,通过ServiceManager来添加MediaPlayerService服务:

defaultServiceManager返回的是刚创建的BpServiceManager,并调用add函数。
BpMediaPlayService作为服务代理端,那么BnMediaPlayerService一定是实现端,MediaPlayerService继承自BnMediaPlayerService,实现了真正的业务函数。