android binder 进程间通信机制5-Service注册和代理对象的获取
ServiceManager,其实也是一个Service,不过它的Server端实现并未使用Binder库的结构实现,而是直接打开binder/dev进行通信的,不具有普遍性。
下面以MediaServer中的MediaPlayService为例,说明更加普遍的使用binder通信机制的Service的实现。
一、Service组件的启动
Service组件是在Server进程中运行的,Server进程通常从其main函数启动,启动时通常做两件事:
1.首先将它里面的Service组件注册到ServiceManager中
2.启动一个Binder线程池来等待和处理Client进程的通信请求。
以MediaServer及其中的MediaPlayService为例,其入口位置为:frameworks\av\media\mediaserver\Main_mediaserver.cpp中。
MeidaPlayService的部分结构图如下:
其完整结构完全按照binder库的结构实现。
其启动过程如下:
上图中talkWithDriver调用中,使用ioctl与binder驱动程序进行交互,会将通信数据封装为一个binder_write_read结构体,使用BINDER_WRITE_READ协议通信。
在Binder驱动程序内部使用binder_ioctl对所要处理的数据进行分发,最终通过binder_thread_read 和 binder_thread_write,将注册请求告诉ServiceManager,并将处理结果再次经过Binder驱动返回MediaServer进程。
二、Service代理对象的获取
Service代理对象的获取过程为一个Client进程与ServiceManager进程标准的Binder通信过程:
示意图如下:
其中getService会调用checkService,IServiceManager的这真正实现类为BpServiceManager,它是ServiceManager的代理对象。Client进程通过它,经由Binder驱动程序与ServiceManager所在的进程取得联系进行通信。
最新文章
- SpringMVC操作指南-登录功能与请求过滤
- 素数方阵的工程ing
- nested exception is java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for
- COJ 2110 Day7-例3
- Chapter 12 外观模式
- SpringMVC(三)-- 视图和视图解析器、数据格式化标签、数据类型转换、SpringMVC处理JSON数据、文件上传
- python相关资料
- Java --Annotation学习心得体会及笔记
- The 12th tip of DB Query Analyzer, powerful in text file process
- git工具使用说明
- 学习笔记CB003:分块、标记、关系抽取、文法特征结构
- python --商品评价---- 数据表结构以及理解
- 集成腾讯位置服务到webapi
- 离线安装redis-cluster
- 计算机网络--HTTP协议
- jQuery 实现点击页面其他地方隐藏菜单
- 使用URLConnection进行访问
- NOI2017 游记
- 力扣(LeetCode)58. 最后一个单词的长度
- [日常] Go语言圣经-错误,函数值习题
热门文章
- 使用.NET Core 构建现代化的桌面应用
- OpenResty + ModSecurity + OWASP CRS
- IT兄弟连 HTML5教程 DIV+CSS网页标准化布局 小结及习题
- (好文转载与总结)Windows10安装ubuntu18.04
- Java网络爬虫 HttpClient
- Spring Boot2解决idea console 控制台输出乱码
- C#中try catch中throw ex和throw方式抛出异常有何不同_异常捕获堆栈丢失问题
- Redis 命令执行全过程分析
- 松软科技web课堂:JavaScript Math 对象
- form表单input回车提交问题