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

看了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()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值