![Android音视频开发](https://wfqqreader-1252317822.image.myqcloud.com/cover/334/31186334/b_31186334.jpg)
3.3 产生过程
在了解MediaPlayerService之前,先了解一下IMediaPlayerService.cpp,在C++ 6.0源码中其处于frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_4.jpg?sign=1739286210-ZFGACrECNGYGH8gNtKWIekhXFpgLMlHc-0-92f06d8c0e404f0a774f5b415f9c4ec1)
可以看出这里定义了一些常规播放控制接口,接下来开始了解MediaPlayerService,首先找到入口,在frameworks/base/media/mediaserver/main_mediaserver.cpp中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_6.jpg?sign=1739286210-Ou9Xe6YE1A8oIyL51OgQ6mYvWPwGxKOW-0-06dd81202dc83bbe909682d858f504c6)
接着看看defaultServiceManager函数,代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1739286210-jljlxPlvJDxcZdnXYqTtUf1joETdtOkQ-0-f04d0182419349e946a17006f3d98f80)
用的是一个单例,每个进程只需要一个BpServiceManager代理,ProcessState::self() ->getContextObject(NULL),接下来看看getContextObject(NULL)函数,看看ProcessState::self() ->getContextObject(NULL),代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1739286210-DtZo9o9NXNcANkcrCTAil3EA8NfKGexM-0-85f1e12e0af58fb4453513c555005622)
总结一下上面的代码,传入的句柄handle值为0,表示ServiceManager,构建一个BpBinder,所以现在相当于gDefaultServiceManager = interface_cast(new BpBinder(0));。
接下来看看interface_cast是什么,其处于frameworks/base/include/binder/IInterface.h中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1739286210-1b0BmsSQvthahqyU26MAODSZozoJj9ZK-0-ee70b3d587d4592babc359e519ae7e31)
等价于:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1739286210-dSX9h5FSkLwXLo1Lx7oZFBga9sXojyLF-0-aab413aaa61445a2868ea3f2a5633ae9)
下面继续跟到IServiceManager里面去,其处于frameworks/base/include/binder/IServiceManager.h中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1739286210-gayEp50xg1GQGG9Rj4hQGHfTgOz0ZKw1-0-62814fb7d8ee59ac09f1cb314f43b1a8)
总结一下,句柄handle(0)创建了一个new BpBinder(0),根据这个BpBinder创建一个BpServiceManager代理。
下面来分析BpServiceManager,代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1739286210-MG1ZjtSaVxBOAjotj8Y6zdRvW2vMwEKk-0-cfbc46beb8c9d1abbcf0664477f1c301)
这里的BpInterface是一个模板类,表示BpServiceManager同时继承于BpInterface和IServiceManager类:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1739286210-oKNQzjSY6SR0u7rfEHqjJVxc6ZdyFYbG-0-a7ea7048fe3f38fbbe9bd1fa33b0174e)
调用了基类BpInterface的构造函数:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1739286210-xBN9K1iTioeQ5ZsOgJ25IEvyFI6FhxmA-0-437d2051d32ee05b461428408bf2418a)
开始添加服务内部,在frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp中,有一个instantiate函数,通过ServiceManager来添加MediaPlayerService服务:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1739286210-CgHcbPqN27oK7VqSfvPSsMZr7mNOgKaD-0-08068df953abdfcfc552e7d59290f76c)
defaultServiceManager返回的是刚创建的BpServiceManager,并调用add函数。
BpMediaPlayService作为服务代理端,那么BnMediaPlayerService一定是实现端,MediaPlayerService继承自BnMediaPlayerService,实现了真正的业务函数。