天天看点

Android Binder机制浅

binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析binder机制,有两点原因:1是目前网上已经有2篇很好的文章了,2是对binder机制进行深入底层乃至驱动的分析这一过程相当困难且相当耗时,因此并不适合重复造轮子。本文的角度是对android的binder机制从整体和概念上进行分析,能够让大家很快明白到底什么是binder,binder是干什么的,binder和应用开发的关系是什么,总之,这篇文章还是很值得去看一看的。

1. 直观来说,binder是android中的一个类,它继承了ibinder接口

2. 从ipc角度来说,binder是android中的一种跨进程通信方式,binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在linux中没有

3. 从android framework角度来说,binder是servicemanager连接各种manager(activitymanager、windowmanager,etc)和相应managerservice的桥梁

4. 从android应用层来说,binder是客户端和服务端进行通信的媒介,当你bindservice的时候,服务端会返回一个包含了服务端业务调用的binder对象,通过这个binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于aidl的服务

android中有大量的cs(client-server)应用方式,这就要求android内部提供ipc方法,而linux所支持的进程通信方式有两个问题:性能和安全性。

目前linux支持的ipc包括传统的管道,system v ipc(消息队列/共享内存/信号量),以及socket,但只有socket支持client-server的通信方式,由于socket是一套通用的网络通信方式,其传输效率低下切有很大的开销,比如socket的连接建立过程和中断连接过程都是有一定开销的。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。共享内存虽然无需拷贝,但控制复杂,难以使用。

在安全性方面,android作为一个开放式,拥有众多开发者的的平台,应用程序的来源广泛,确保智能终端的安全是非常重要的。终端用户不希望从网上下载的程序在不知情的情况下偷窥隐私数据,连接无线网络,长期操作底层设备导致电池很快耗尽等等。传统ipc没有任何安全措施,完全依赖上层协议来确保。首先传统ipc的接收方无法获得对方进程可靠的uid/pid(用户id/进程id),从而无法鉴别对方身份。android为每个安装好的应用程序分配了自己的uid,故进程的uid是鉴别进程身份的重要标志。使用传统ipc只能由用户在数据包里填入uid/pid,但这样不可靠,容易被恶意程序利用。可靠的身份标记只有由ipc机制本身在内核中添加。其次传统ipc访问接入点是开放的,无法建立私有通道。比如命名管道的名称,system

v的键值,socket的ip地址或文件名都是开放的,只要知道这些接入点的程序都可以和对端建立连接,不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。

基于以上原因,android需要建立一套新的ipc机制来满足系统对通信方式,传输性能和安全性的要求,这就是binder。binder基于 client-server通信模式,传输过程只需一次拷贝,为发送发添加uid/pid身份,既支持实名binder也支持匿名binder,安全性高。下图为binder通信过程示例:

Android Binder机制浅

参考:

1. http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html

2. http://disanji.net/2011/02/28/android-bnder-design/

继续阅读