概念
MediaPlayerService是多媒体框架一个非常重要的服务,我们可以理解MediaPlayer是客户端,MediaPlayerService和MediaPlayerService::Client是服务器端。
MediaPlayerService
实现IMediaPlayerService
定义的业务逻辑,其主要功能是根据MediaPlayer::setDataSource输入的URL调用create函数创建对应的player。
MediaPlayer::Client实现IMediaPlayer
定义的业务逻辑,其主要功能包括start、stop、pause等,其是通过调用MediaPlayerService create的player中的对应方法来实现具体功能的
C/S通过IPC的通信流程图
总结
1.MediaPlayer是客户端
2.MediaPlayerService和MediaPlayerService::Client是服务器端
3.MediaPlayerService实现IMediaPlayerService
定义的业务逻辑,其主要功能是根据MediaPlayer::setDataSource输入的URL调用create
函数创建对应的player
4.MediaPlayer::Client实现IMediaPlayer定义的业务逻辑,其主要功能包括start、stop、pause等,其是通过调用MediaPlayerService create的player中的对应方法来实现具体功能的
5.通过Transact
函数可以向远端的IBinder
对象发出调用,通过onTransact
函数可以使你自己的远程对象能够响应接收到的调用
相关联的类图
总结
1.BnXXX派生自public IXXX,PUBLIC BpRefBase
.BpXXX派生自public IXXX,PUBLIC BBinder
2.IXXX可以理解为定义业务逻辑,在BpXXX中,把对应的binder_transaction_data
打包之后,通过BpRefBase中的mRemote(BpBinder)
发送出去,并等待结果。在BnXXX中,实现对应的业务逻辑,通过调用BnXXX派生类中的方法来实现,如MediaPlayerService::Client
3.从下图可以看出IBinder用于进行进程间通信
4.从上图的BpRefBase
中有一个remote
函数用来与Binder驱动交互使用
5.Binder是用来从Binder驱动中接收相关请求并进行相关处理的
6.BpBinder
和BinderDriver
进行互通
产生过程
了解一下IMediaPlayerService
在IMediaPlayerService.h中我们可以看出这里定义了一些常规播放控制接口
接下来查看MediaPlayerService
,它的入口是frameworks/base/media/main_mediaserver.cpp
中
查看其中的defaultServiceManager
函数
它用的是一个单例,每个进程只需要一个BpServiceManager
代理,接下来看看ProcessState::self()->getContextObject(NULL)
传入的句柄handle
值为0,表示ServiceManager
,构建一个BpBinder
,所以现在相当于gDefaultServiceManager=interface_cast(new BpBinder(0))
然后查看interface_cast
INTERFACE等价于IServiceManager
然后跟到IServiceManager.h中去
下面的宏定义存在于IInterface
中
在DECLARE_META_INTERFACE
这个宏里定义了asInterface, 在IMPLEMENT_META_INTERFACE
里实现了它,最终会构造出一个BpServiceManager
对象传给intr
总结:句柄handle(0)创建了一个new BpBinder(0),根据这个BpBinder创建一个BpServiceManager代理
下面分析BpServiceManager
这里的BpInterface
是一个模板类,表示BpServiceManager同时继承于BpInterface和IServiceManager类
然后调用基类BpInterface
的构造函数BpInterface<IServiceManager>::BpInterace(const sp<IBinder>& remote) : BpRefBase(remote){}
,这里的remote就是构造的BpBinder
开始添加服务内部,在frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
中,有一个instantiate
函数,通过ServiceManager来添加MediaPlayerService服务
defaultServiceManager返回的是刚创建的BpServiceManager
,并调用add函数
BpMediaPlayService作为服务代理端,那么BnMediaPlayerService一定是实现端,MediaPlayerService继承自BnMediaPlayerService,实现了真正的业务函数
添加服务的过程
分析BpServiceManager的addService
函数
上图的remote()
就是前面创建的BpBinder(0)
对象
进入self()->transact
中
上图中writeTansactionData
发送了ADD_SERVICE_TRANSACTION
请求
以及waitForResponse
(部分)
注意其中的talkWithDriver
(部分)
IPCThreadState::joinThreadPool、ProcessState::self->startThreadPool进入线程循环,talkWithDriver等待客户端Client请求,从Binder读取命令请求进行处理。到现在为止,MediaPlayerService的服务器端已经向服务总管ServiceManager
注册了