Android中的IPC为何要采用Binder机制
Binder是Android系统提供的一种进程间通信(IPC)机制。由于Android是基于Linux内核的,因此,还存在其他的IPC机制,Linux已经拥有的进程间通信IPC手段包括:管道(Pipe)
、信号(Signal)和跟踪(Trace)
、Socket
、报文队列(Message)
、共享内存(Shared Memory)
和信号量(Semaphore)
。采用Binder机制主要有两点,性能和安全。在移动设备上,广泛地使用跨进程通信肯定对通信机制本身提出了严格的要求;Binder相对出传统的Socket方式,更加高效;另外,传统的进程通信方式对于通信双方的身份并没有做出严格的验证,只有在上层协议上进行架设;比如Socket通信ip地址是客户端手动填入的,都可以进行伪造;而Binder机制从协议本身就支持对通信双方做身份校检,因而大大提升了安全性。这个也是Android权限模型的基础。
Binder相对于其他IPC机制更加灵活方便。Android系统基本上可以看做是一个基于Binder通信的C/S架构。Binder就像网络一样,把系统各个部分连接在一起。
Android中Binder实现原理
Android中的Binder通信都是通过虚拟设备/dev/binder
来实现的,Binder的驱动代码在kernel/driver/android/binder.c中,代码还算简单。我们知道一些硬件都会对应一个驱动程序,而Binder驱动程序没有对应的硬件,所以叫做虚拟设备驱动程序,其实/dev/binder
就是一个字符设备,或者叫混杂设备(miscdevice)。
Binder机制由一些系统组件组成:Client
、Server
、Service Manager
和Binder驱动程序
,其中Client
、Server
和Service Manager
运行在用户空间,Binder驱动程序
运行在内核空间。其中的核心组件便是Binder驱动程序,Service Manager
提供了辅助管理的功能,Client
和Server
正是在Binder驱动
和Service Manager
提供的基础设施上实现通信。组件之间的关系如下图:
Binder驱动程序提供设备文件/dev/binder
与用户空间交互,Client
、Server
和Service Manager
通过文件操作函数open()
和ioctl()
与Binder驱动程序进行通信。Service Manager
是整个Binder机制的保护进程,用来管理开发者创建的各种Server
(Server进程注册一个或多个Service到Service Manager中),并向Client
提供查询Server
远程接口的功能。Service Manager
的源代码位于frameworks/native/cmds/servicemanager目录中,主要由binder.h、binder.c和servicemanager.c组成。
Binder是Android中非常重要的机制,详细内容远不止如此,这里只是简单介绍,更多内容可以看这两篇文章:
Android Bander设计与实现 - 设计篇
Android进程间通信(IPC)机制Binder