![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=1738884541-7e2Yc7FoLYKXKrBznpHGU7XvG7c2slUS-0-bd948eeb6d3d6dae12aa9f3040b5e340)
可以看出这里定义了一些常规播放控制接口,接下来开始了解MediaPlayerService,首先找到入口,在frameworks/base/media/mediaserver/main_mediaserver.cpp中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_6.jpg?sign=1738884541-UHcRf474Dm2auwe3KsVbdUe7PQnVJfJ0-0-eda68fe0f8b451c9d849ae161afce8be)
接着看看defaultServiceManager函数,代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1738884541-XGQqzIWJDG7DTOb0ALyESioitA5kePp1-0-727668b6307c7ed42438dc9bab68e190)
用的是一个单例,每个进程只需要一个BpServiceManager代理,ProcessState::self() ->getContextObject(NULL),接下来看看getContextObject(NULL)函数,看看ProcessState::self() ->getContextObject(NULL),代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1738884541-3Z83mKsqzVrgt3LtlPv4lrSIbu0KGTDJ-0-17bac4dfb3d6e56b9a76c3224a6f17c4)
总结一下上面的代码,传入的句柄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=1738884541-U0kAeRJLsJFeh9lLNexah97LI89kKNXq-0-c7883ae6cbdc2cf6ad7793b0ecf11732)
等价于:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1738884541-vsK04n5MOHGpnw9WYyxxYEwfvRdpquzd-0-09d0de1a5a5eba50f615d891f3791ab4)
下面继续跟到IServiceManager里面去,其处于frameworks/base/include/binder/IServiceManager.h中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1738884541-P4h5fHKYse6x6WbbSQFju7AfqYucphR3-0-6610c867a95b1f27b120a02df1fcd5b5)
总结一下,句柄handle(0)创建了一个new BpBinder(0),根据这个BpBinder创建一个BpServiceManager代理。
下面来分析BpServiceManager,代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1738884541-GT6QrlZpUSLmeg8imWueQoGEWTR6NrFJ-0-96729aba9ac0209e72c175aaf1de42b8)
这里的BpInterface是一个模板类,表示BpServiceManager同时继承于BpInterface和IServiceManager类:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1738884541-MzBit4tlJpTNgzBXH00FNGnQ02RgbflH-0-38fed158c9c9ad023392e878b72562d3)
调用了基类BpInterface的构造函数:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1738884541-ny7MpdGsTJxchVjChw3dpCLfHkc2iBZX-0-c031e2dbcc254fb3acd9ed92f0a2830a)
开始添加服务内部,在frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp中,有一个instantiate函数,通过ServiceManager来添加MediaPlayerService服务:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1738884541-yvOxfBvCe2bKj9I2lp82jBHdM3YeSJqK-0-0dc21960832e7c14f6b6935c367c0ff5)
defaultServiceManager返回的是刚创建的BpServiceManager,并调用add函数。
BpMediaPlayService作为服务代理端,那么BnMediaPlayerService一定是实现端,MediaPlayerService继承自BnMediaPlayerService,实现了真正的业务函数。