博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android binder
阅读量:5969 次
发布时间:2019-06-19

本文共 1191 字,大约阅读时间需要 3 分钟。

  hot3.png

android 实现binder机制的server进程学习

进程开始会打开binder设备,谁打开的呢?就是ProcessState:self,再加一句,这个对象是单例的。它还会创建一个接收数据的共享内存,返回fd,每个进程只会打开一次binder设备。

server要想跟服务管理器注册服务,就需要一个代理,跟服务管理器交互,即IServiceManager,defaultServiceManager返回在服务管理器的代理端,这个interface_cast需要一个BpBinder作为参数,先探讨参数BpBinder的产生过程;ProcessState::self->getContextObject需要传递一个参数Handler 0(0就是服务管理器,其余的服务是别的),根据Handler查询返回代理端IBinder(BpBinder(0)),这中间的过程呢,根据两个宏定义,一个声明方法,一个实现方法,来生成了一个Bp**

BpBinder 是客户端用来与server交互的代理类,p即Proxy的意思;BBinder则是与proxy相对的一端,他是proxy交互的目的端,如果说Proxy代表客户端,那么BBinder则代表服务端。

IServiceManager、BpServiceManager和BnServiceManager都与业务逻辑相关,BnServiceManager同时从IServiceManager BBinder派生,表示它可以直接参与Binder通信,BpServiceManager虽然从BpInterface中派生,但是这条分支似乎与BpBinder没有关系,BnServiceManager是一个虚类,它的业务函数最终需要子类来实现,

既然BpServiceManager与Binder 没哟直接的关系,那么它与Binder是怎样交互的呢,请注意看源代码,BpServiceManager的基类构造函数中,需要的参数就是IBinder类型,实际就是BpBinder,这样BpServiceManager的一个变量MRemote指向BpBinder,BpServiceManager会实现IServiceManager中定义的虚函数,BpBinder作为通信的代表,就跟Binder有关系了。

接下来分析注册一个服务实例,来学习业务层的工作的完成。在服务的初始化中,注册服务到服务管理器。服务的addService把请求数据打包成data后,传给了BpBinder的transact函数,表示业务层addService的方法,把通信层的工作交给了BpBinder。

而真正与Binder通信的是transact中的IPCThreadState方法,

转载于:https://my.oschina.net/snail0/blog/387858

你可能感兴趣的文章
EXSi5.5安装篇
查看>>
开始记录吧
查看>>
windows下用php开发类似百度文库应用需要的工具和问题
查看>>
css模拟select设置高度在ie67下有效(也可作为去除边框)
查看>>
互联网思维
查看>>
ecshop备份数据 ecshop转移数据 ecshop更换主机
查看>>
手机将与瘦客户机争夺办公桌面
查看>>
ubuntu下针对php的thrift 安装折腾记录
查看>>
使用C#客户端访问FTP服务的一个解决方案
查看>>
对软件测试团队“核心价值”的思考
查看>>
mysql基础知识点
查看>>
Microsoft.System.Center.Operations.Manager.2007 中文版完整光盘下载地址
查看>>
Python快速教程
查看>>
ssh免密码登录
查看>>
Linux下Django环境安装
查看>>
如何在指定的内容中找出指定字符串的个数
查看>>
我的友情链接
查看>>
浅谈如何用We7站群平台打造垂直性政务网站
查看>>
我的友情链接
查看>>
Traversing Mapping Filtering Folding Reducing
查看>>