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---------(功能类似于)---------->    通信录


image

1,首先建一张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的操作例子,收藏文章如下:

https://www.cnblogs.com/huangjialin/p/7738104.html

你可能感兴趣的:(Binder)