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