Android——Binder

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

1. 背景知识linux

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

那么,linux中有不少的IPC通讯机制,来进行进程间的通讯,为什么android还要建立本身的进程间通讯机制Binder哪? 接下来,先看下linux下不一样的通讯机制git

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

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

消息队列:一个FIFO的消息队列,一样须要进行两次数据拷贝,并且因为须要维护这个消息队列,所以是须要额外的CPU消耗的,并不适合与信息量很大的通讯网络

信号:信号本质上是通知某个进程某个事情发生了,从而某个进程知道本身下一步须要干些什么,进程也能够本身给本身发信号进行控制。因此信号更加适合与进程的中断控制等等,而不是用来进行信息的交换架构

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

套接口:更为通常的进程间通讯机制,主要是用于不一样的操做系统,不一样的设备,不一样的网络之间的进程间通讯。最初由Unix系统的BSD分支开发,后来被普遍应用与其余系统之上。可是因为其更加通用,所以传输效率是比较低的,并且一样须要拷贝两次数据socket

共享内存:多个进程能够访问同一个内存空间,是全部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接口,而后才能开始进行通讯

 

 

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

相关文章
相关标签/搜索