以MediaPlayerService启动流程分析Binder工作流程

来源:互联网 发布:javascript小程序 编辑:程序博客网 时间:2024/06/06 12:31

看了Binder的机制,总是忘记,记录下分析过程以做备忘用。

MediaPlayerService启动流程分析:
main_mediaserver.cpp

ProcessState::self() //创建一个ProcessState对象    sp<IServiceManager> sm = defaultServiceManager();          gDefaultServiceManager = interface_cast<IServiceManager>(new BpBinder(0));//BpBinder构造函数new 一个IPCThreadState对象             new BpServiceManager(new BpBinder(0));               //sp<IServiceManager> sm = defaultServiceManager(); 返回的实际是BpServiceManager,它的               //remote对象是BpBinder,传入的那个handle参数是0。                               MediaPlayerService::instantiate();        defaultServiceManager()->addService(String16("media.player"), new MediaPlayerService());//创建一个新的Service-BnMediaPlayerService,调用BpServiceManager的addService函数把它告诉ServiceManger                   BpBinder::transact(ADD_SERVICE_TRANSACTION, data, &reply);                     IPCThreadState::self()->transact;                       writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL);//把命令数据封装成binder_transaction_data,写到命令缓冲区Parcel                       waitForResponse(Parcel *reply, status_t *acquireResult);                         talkWithDriver();   //告知Binder驱动,在service_manger.c有个binder_loop通过ioctl阻塞等待处理BpServiceManager发过来SVC_MGR_ADD_SERVICE命令,最终把Service添加到serviceManger维护的一个服务列表,以便Client通过getService查询。   ProcessState::self()->startThreadPool();   ......   IPCThreadState::joinThreadPool      talkWithDriver();     //阻塞等待Client端的请求     executeCommand(cmd);      case BR_TRANSACTION:        BBinder->transact()              onTransact()   //BnMediaPlayerService从BBinder派生,所以会调用到它的onTransact函数                  //BnMediaPlayerService的onTransact函数收取命令,然后派发到MediaPlayerService的函数,                  //由它完成实际的工作。                   整个过程有两对,发送-等待接收请求的过程:                  1、启动service_manger,打开binder设备,创建binder_loop,等待BpServiceManager请求,相当于BnServiceManger的作用,主要负责addService,   getService等工作2、调用joinThreadPool()启动线程,打开binder设备,搞一个looper循环,然后等待Client端的服务请求


以MediaPlayer调用decode为例,整个调用过程:
MediaPlayer::decode()    //MediaPlayer.cpp
service = getMediaPlayerService();  //获取BpMediaPlayerService
service->decode();
BpMediaPlayerService::decode()  
BpBinder::transact()
IPCThreadState::transact()
IPCThreadState::waitForResponse()
IPCThreadState::executeCommand :BR_TRANSACTION
IPCThreadState::executeCommand :b->transact()  //b即BBinder
BBinder::transact()
BBinder::onTransact()       
BnMediaPlayerService::onTransact()       //BnMediaPlyaerService为BBinder的派生类
case DECODE_FD:
 decode()即MediaPlayerService::decode()