![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=1739315061-URK27fE2tT5TdCc3qW3ra9DnHTLdbHY5-0-bd63532b3e5d1a742f2770fc419d04a7)
可以看出这里定义了一些常规播放控制接口,接下来开始了解MediaPlayerService,首先找到入口,在frameworks/base/media/mediaserver/main_mediaserver.cpp中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_6.jpg?sign=1739315061-W6zq7o7WuhcUTv1G4zbXFkaqiy5ZXmL1-0-5687f54aa673184827f3829e55a90424)
接着看看defaultServiceManager函数,代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1739315061-UamCsg1b4gZsXpzQBnLxVJ36O67irzTz-0-4ae661a242d5c61f794cf1ee1efcac0b)
用的是一个单例,每个进程只需要一个BpServiceManager代理,ProcessState::self() ->getContextObject(NULL),接下来看看getContextObject(NULL)函数,看看ProcessState::self() ->getContextObject(NULL),代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_9.jpg?sign=1739315061-SEmI7Z5aQ6dAbR13E5Mzc9iH1rj761UK-0-4cf64b3bc651a95452edf869cdbd0792)
总结一下上面的代码,传入的句柄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=1739315061-DGYG16dUbzzp1CHGVJt7To294Eu6mKrA-0-511c355b9c8ca8e4a8858b37b4c315b7)
等价于:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1739315061-VSfpRU4zEePEdBbWiUw7azi4i9Dk2aix-0-701b8d7a7ab97b92661e8ed7e3ff20cd)
下面继续跟到IServiceManager里面去,其处于frameworks/base/include/binder/IServiceManager.h中:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1739315061-LWeDluyWMb5LkOq1qexR6JFYkSSutMX7-0-45816ddb21011576c8159a459c99a466)
总结一下,句柄handle(0)创建了一个new BpBinder(0),根据这个BpBinder创建一个BpServiceManager代理。
下面来分析BpServiceManager,代码如下:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1739315061-ln0OFK5kxK1ISs5qB7LCzd83baFjDINh-0-6a43cff3b5ae3f94a27881226b378b15)
这里的BpInterface是一个模板类,表示BpServiceManager同时继承于BpInterface和IServiceManager类:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1739315061-dpeRxDeCBLbOQHK2aqOdsqfPYUR3LfwZ-0-ab880c1b5a64a926d0b18376f2d53cfe)
调用了基类BpInterface的构造函数:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1739315061-Q3S7Z84wD80skXIH7E3O84yfrIit3jZW-0-735ec9c245931e7f097ff72b7e2a70f7)
开始添加服务内部,在frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp中,有一个instantiate函数,通过ServiceManager来添加MediaPlayerService服务:
![](https://epubservercos.yuewen.com/13E7E8/16896237204360306/epubprivate/OEBPS/Images/txt003_18.jpg?sign=1739315061-ewEwEvHpSaOrb3O6fRRk9O2nl3fIbxi3-0-5491ed0bdb0f8f68fa66e2fb19714358)
defaultServiceManager返回的是刚创建的BpServiceManager,并调用add函数。
BpMediaPlayService作为服务代理端,那么BnMediaPlayerService一定是实现端,MediaPlayerService继承自BnMediaPlayerService,实现了真正的业务函数。