Android——Binder

该文章的知识点基本上来自于这个连接,然后融入了自己的一些理解:http://gityuan.com/2015/10/31/binder-prepare/

1. 背景知识

Android的四层结构中,最底层是linux的kenel层,也就是说Android实际上还是基于linux来进行实现的,基本的实现代码是C语言,而C语言是一个面向结构的语言,而非是面向对象的语言

那么,linux中有很多的IPC通信机制,来进行进程间的通信,为何android还要创建自己的进程间通信机制Binder哪? 接下来,先看下linux下不同的通信机制

linux下的进程通信手段基本上都是从Unix平台上继承而来的,最初的Unix IPC有

管道及有名管道:管道在创建的时候会分配一个page大小的内存,其缓存区大小比较有限,而且管道在数据拷贝时需要进行两次拷贝

消息队列:一个FIFO的消息队列,同样需要进行两次数据拷贝,而且由于需要维护这个消息队列,因此是需要额外的CPU消耗的,并不适合与信息量很大的通信

信号:信号本质上是通知某个进程某个事情发生了,从而某个进程知道自己下一步需要干些什么,进程也可以自己给自己发信号进行控制。所以信号更加适合与进程的中断控制等等,而不是用来进行信息的交换

信号量:更多地是作为一种锁的机制,保证了进程之间以及线程之间的数据同步问题。

套接口:更为一般的进程间通信机制,主要是用于不同的操作系统,不同的设备,不同的网络之间的进程间通信。最初由Unix系统的BSD分支开发,后来被广泛应用与其他系统之上。但是由于其更加通用,因此传输效率是比较低的,而且同样需要拷贝两次数据

共享内存:多个进程可以访问同一个内存空间,是所有IPC中效率最高的进程间通信,而且根本不需要任何的数据拷贝,是直接共享的。

 

2. Binder的出现

综上,信号和信号量基本上被排除了,不适合与用来进行Android四大组件之间的信息传递,接下来就剩其他三个了

(1) 语言上,linux的IPC都是使用C语言来实现的,而整个Android的framework层以及application层都是使用java来实现的。

(2) 从协议上来讲,Android的创造者并不像开源他的代码,这也是自身的商业性质决定的。而linux的主线是开源的。

上面这两个可能是Binder出现的最本质原因,而下面是从开发者角度来看

(3) 性能上,binder只需要一次数据拷贝,而管道 ,套接口,消息队列都需要两次数据拷贝。

(4) 共享内存虽然不需要进行数据拷贝。但从稳定性上来讲,采用C/S的bander比共享内存更加稳定。

(5) 安全上,linux的IPC无法获取对方进程可靠的UID/PID,而Android给应用分配了自己的UID,而且C/S模式保证了Android系统对外只暴露client,而保护了server端。

 

3. BBinder,BpBinder,IBinder

BBinder:对于serveice来说,都是继承了BBinder(BnInterface)。BBinder.onTransact()接收相应的事务请求

BpBinder:对与client来说,都是继承了BpBinder(BpInterface)。BpBinder.transact()分发事务请求

IBinder:相当于一个指针,就像socket的ID一样,IBinder是一个进程的唯一标识,是重构上述两个Binder时作为参数传入的。BBinder和BpBinder都是继承于IBinder的

 

4. Binder的架构

图片同样来自于:http://gityuan.com/2015/10/31/binder-prepare/

(1) Service Manager相当于一个管理者,指的是Native曾的ServiceManager(C++),是Binder的守护进程

(2) Client和Server的通信需要先获取Service Manager接口,然后才能开始进行通信

 

 

源码分析之后会慢慢补上。。。

 

           

 

posted @ 2017-10-13 18:32  东木刀纹  阅读(249)  评论(0编辑  收藏  举报