概念
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注册了
本文详细介绍了Android多媒体框架中的MediaPlayerService及其客户端MediaPlayer的交互机制。MediaPlayerService作为服务器端,实现IMediaPlayerService接口,负责根据MediaPlayer的setDataSource创建播放器。而MediaPlayer::Client作为客户端,实现IMediaPlayer接口,处理start、stop等操作。整个过程通过IPC的BpBinder和BnBinder实现进程间通信,涉及到ServiceManager的注册和服务添加流程。
998

被折叠的 条评论
为什么被折叠?



