该文章的知识点基本上来自于这个链接,而后融入了本身的一些理解: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接口,而后才能开始进行通讯
源码分析以后会慢慢补上。。。