Binder
一,Linux内核的基础知识
二,Binder通信机制介绍
三,AIDL
一,linux内核的基础知识
1,进程隔离/虚拟空间地址空间
对于操作系统而言,不同进程间数据不共享
Binder通信机制 = 不同进程间通信
2,系统调用
即对内核有某些保护机制来告诉应用程序,哪些可以调用,哪些不可以调用。
即讲内核层与上层应用程序抽象分离开来。
也就是内核层和用户空间。
系统调用,可以在用户空间内访问内核的某些程序。
3,Binder驱动
在安卓系统中,运行在内核空间,负责各个用户进程,通过Binder通信的内核来进行通信,驱动程序一般指设备的驱动程序,可以使计算机和设备通信的特殊程序,虽是软件又相当于硬件接口,操作系统可通过接口,控制硬件设备。
二,Binder通信机制的介绍
1,为什么要使用Binder
2,binder的通信模型
3,binder通信机制原理
1,为什么要使用binder
1)android使用linux内核拥有着非常多的跨进程通信机制(管道,socket)
2)性能(广泛地使用跨进程通信,肯定对通信机制本身提出严格地要求,Binder相当于传统的Socket方式,更高级)
3)安全(由于传统的进程间的通信对通信双方的身份作出严格的验证,只有上层协议才会进行架构)
比如说Socket通信,IP地址是客户端手动填写的,你可以人为地伪造,而binder通信从协议本身就支持通信双方进行身份校验,这是binder在安全性上做出的努力,在这基础上大大提高了安卓程序的安全性,这binder身份校验,也是安卓权限,模型的基础
2,binder通信模型
1,电话基站:binder驱动;
2,通信录:SeviceManager;
进程A ----> (通信) --------->进程B
借助内核:
Binder驱动---------(功能类似于)----------> 电话基站
ServiceManager---------(功能类似于)----------> 通信录
image1,首先建一张ServiceManager表
2,把“电话号码”存入(注册) ---> ServiceManager中
3,当有同学与其它同学进行交互时,会进入ServiceManager中查询“电话号码”,然后ServiceManager会返回“电话号码”。
4,“联系”:Binder通信
3,Binder通信介绍
image数据在内核里。
进程 > 线程
add方法是空方法
参数包装好后返回内核去调用给Binder驱动 ------> 进入SM中的表-------> 通知服务端,再替换,调用add方法再把参数弄回去
问:到底什么是Binder?
答:
1)通常意义下,Binder指的是一种(跨进程)通信机制
2)对Server进程而言,Binder指的是Binder本地对象 / 对于Client而言,Binder指的是Binder代理对象
3)对于传输过程而言,Binder是可以进行跨进程传送的对象。
三,AIDL
定义:
AIDL(Android Interface Definition Language)是Android接口定义语言的意思,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。
实际上实现跨进程之间通信的有很多,比如广播,Content Provider,但是AIDL的优势在于速度快(系统底层直接是共享内存),性能稳,效率高,一般进程间通信就用它。
即gen目录下,asInterface()方法中,若同进程则不会走跨进程,不同进程则走跨进程(用IBinder),返回StubProxy(obj)一个代理对象。
onTransace()方法通过AIDL返回的编号,来进行相应的方法,传递编号使用compute()方法。
IBinder--接口
代理表跨进程传输的能力,实现该接口就能跨进程传递
在底层传输时,驱动会识别IBinder类型的数据
如果是IBinder代理,即IBinderProxy对象
compute方法中,先用pracel序列表代码,transact方法,最后调用onTransact方法。
AIDL的操作例子,收藏文章如下: