Android Binder机制浅析

摘要

Binder是android中一个很重要且很复杂的概念,它在系统的总体运做中发挥着极其重要的做用,不过本文并不打算从深层次分析Binder机制,有两点缘由:1是目前网上已经有2篇很好的文章了,2是对Binder机制进行深刻底层乃至驱动的分析这一过程至关困难且至关耗时,所以并不适合重复造轮子。本文的角度是对Android的Binder机制从总体和概念上进行分析,可以让你们很快明白到底什么是Binder,Binder是干什么的,Binder和应用开发的关系是什么,总之,这篇文章仍是很值得去看一看的。html

什么是Binder

1. 直观来讲,Binder是Android中的一个类,它继承了IBinder接口linux

2. 从IPC角度来讲,Binder是Android中的一种跨进程通讯方式,Binder还能够理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通讯方式在linux中没有android

3. 从Android Framework角度来讲,Binder是ServiceManager链接各类Manager(ActivityManager、WindowManager,etc)和相应ManagerService的桥梁缓存

4. 从Android应用层来讲,Binder是客户端和服务端进行通讯的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,经过这个Binder对象,客户端就能够获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务安全

为何Android内核要使用Binder

Android中有大量的CS(Client-Server)应用方式,这就要求Android内部提供IPC方法,而linux所支持的进程通讯方式有两个问题:性能和安全性。网络

目前linux支持的IPC包括传统的管道,System V IPC(消息队列/共享内存/信号量),以及socket,但只有socket支持Client-Server的通讯方式,因为socket是一套通用的网络通讯方式,其传输效率低下切有很大的开销,好比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通讯过程示例:spa

参考:.net

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

2. http://blog.csdn.net/universus/article/details/6211589

相关文章
相关标签/搜索