摘要
Binder是安卓
的一个重要而复杂的概念,在整个系统的运行中起着极其重要的作用,但本文并不打算深入分析Binder机制,有两个原因。 一个是现在在网上已经有了
有两篇好文章。 第二,从基础到驱动深入分析Binder机制的过程相当困难和耗时,因此不适合重复制造车轮。 正文的角度是正确的
从整体和概念上分析Android的Binder机制,可以很快了解Binder是什么、Binder是什么以及Binder和APP应用程序开发
的关系是什么,总之,这篇文章还是值得去看的。
什么是Binder
1 .直观上,Binder是一个安卓类,继承了IBinder接口
2 .从IPC的角度来说,Binder是Android中的进程间通信方案,Binder也可以被理解为在linux上没有的虚拟物理设备
从Android Framework来看,Binder是连接服务管理器与各种管理器(activity manager、WindowManager、etc )对应的管理器服务的桥梁
4.
对于Android APP应用层来说,Binder是客户端与服务端进行通信的介质,在笨蛋bindService的情况下,服务端包含服务端的业务呼叫
Binder对象。 通过此Binder对象,客户端可以获取服务端提供的服务或数据。 这里的服务包括常规服务和基于AIDL的服务
为什么安卓内核要使用Binder?
Android有许多客户端-服务器(cs ) APP应用程序,需要在Android内部提供IPC方法。 linux支持的进程通信方式有两个问题:性能和安全性。
眼睛
旧linux支持的IPC包括传统的管道和系统v
IPC )消息队列/共享内存/信号)和套接字,但只有套接字支持客户端-服务器通信方式。 因为插座是共同的一套
网络通信方式在传输效率降低方面存在很大的开销,例如在套接字的连接建立过程和连接中断过程中存在一定的开销。 消息队列和管道采用存储-传输方法,即数量
至少有两个复制过程,从发送方缓存复制到内核打开的缓存,然后从内核缓存复制到接收方缓存。 共享内存不需要复制,但控制复杂,难以使用
使用。
在安全方面
面,安卓作为一个开放、拥有众多开发者的平台,APP应用来源广泛、确保智能手机安全非常重要。 是否有最终用户不想从互联网下载的程序
获取信息的同时窥探隐私数据,连接无线网络,长期操作基础设备,电池很快就会消耗殆尽等。 传统的IPC没有任何安全措施,完全依赖高层协商来确保。 首先是传统的IPC
的接收方无法获取对方进程的可信UID/PID (用户ID/进程ID ),无法确定对方的身份。 Android是每个已安装的APP应用程序自己的
UID,因此进程的UID是识别进程身份的重要标志。 在传统的IPC中,用户只能在分组中写入UID/PID,但这样不可靠,容易被恶意软件利用。 坚实的身体
标记由IPC机制本身添加到内核中。 其次,传统的IPC接入点是开放的,无法建立专用渠道。 例如管道名称、系统
v的密钥值、套接字的ip地址或文件名都是开放的,如果知道这些接入点的程序可以与对方建立连接,就无法阻止恶意程序猜测并获取对方的地址
必须连接。
基于以上的原因
因此,Android需要建立新的IPC机制,以满足系统对通信方式、传输性能和安全性的要求。 这就是Binder。 Binder呢
客户端-服务器通信模式,传输过程是一个副本,添加uid/PIDidid进行发送,同时支持实名Binder和匿名Binder,具有安全性
很贵。 下图为Binder通信管理器的示例。
参考: