BruceFan's Blog

Stay hungry, stay foolish

0%

Android跨进程通信——Binder实现机制

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机制由一些系统组件组成:ClientServerService ManagerBinder驱动程序,其中ClientServerService Manager运行在用户空间,Binder驱动程序运行在内核空间。其中的核心组件便是Binder驱动程序,Service Manager提供了辅助管理的功能,ClientServer正是在Binder驱动Service Manager提供的基础设施上实现通信。组件之间的关系如下图:

Binder驱动程序提供设备文件/dev/binder与用户空间交互,ClientServerService 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