以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()
- 以MediaPlayerService启动流程分析Binder工作流程
- android Binder 工作流程
- android Binder工作流程
- android Binder工作流程
- android Binder 工作流程
- Binder通信流程分析
- Android JB MediaPlayer MediaPlayerService Binder 构建 分析
- [netty源码分析]--服务端启动的工作流程分析
- Hadoop Namenode以regular方式启动代码流程分析
- haproxy工作流程分析
- surfaceflinger 工作流程分析
- Zygote工作流程分析
- surfaceflinger 工作流程分析
- hadoop工作流程分析
- 分析Netty工作流程
- uboot工作流程分析
- webpack工作流程分析
- SpringMVC工作流程分析
- maven 项目+jetty容器 配置 eclipse
- C++ Primer中文版(第5版)
- 第六次作业流数据的标准差NO.2
- android 软键盘Enter键图标的设置
- 项目初始化首页跳转页面
- 以MediaPlayerService启动流程分析Binder工作流程
- 面向对象
- 8种错误睡姿让宝宝越睡越迟钝 应及时纠正
- android 点击EditTextView不弹出输入法
- 将图像文件编译到可执行文件内
- 转 Simplified Approach to Resolve ORA-4031
- 公开的免费STUN服务器
- 各种颜色的RGB
- Json:Json格式、Jsoncpp简介