Binder进程间通信机制概述(Android系统源代码情景分析学习笔记)

在Android系统中,每一个应用程序都是由Activity、Service、Broadcast Receiver和Content Provider四大组件组成的。这些组件有可能运行在同一个进程中,也有可能运行在不同的进程中。那么,不在同一个进程的组件是如何通信的呢?这就涉及到了Binder进程间通信机制。

Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。有传统的管道(Pipe)、信号(Signal)和跟踪(Trace),这三项通信手段只能用于父进程与子进程之间,或者兄弟进程之间;后来又增加了命令管道(Named Pipe),使得进程间通信不再局限于父子进程或者兄弟进程之间;为了更好地支持商业应用中的事务处理,在AT&T的Unix系统V中,又增加了三种称为“System V IPC”的进程间通信机制,分别是报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore);后来BSD Unix对“System V IPC”机制进行了重要的扩充,提供了一种称为插口(Socket)的进程间通信机制

但是,Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制,难道是因为考虑到了移动设备硬件性能较差、内存较低的特点?不得而知。Binder其实也不是Android提出来的一套新的进程间通信机制,它是基于OpenBinder来实现的。

Android系统的Binder机制,由一系列系统组件组成,分别是Client、Server、Service Manager和Binder驱动程序。其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上进行Client-Server之间的通信。Service Manager和Binder驱动已经在Android平台中实现好,开发者只要按照规范实现自己的Client和Server组件就可以了。

Android系统Binder机制中的四个组件Client、Server、Service Manager和Binder驱动程序的关系如下图所示:
Binder进程间通信机制概述(Android系统源代码情景分析学习笔记)
关于Binder进程间通信机制总结下来有如下几点:

  • Client、Server和Service Manager实现在用户空间中,Binder驱动程序实现在内核空间中
  • Binder驱动程序和Service Manager在Android平台中已经实现,开发者只需要在用户空间实现自己的Client和Server。
  • Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信
  • Client和Server之间的进程间通信通过Binder驱动程序间接实现。
  • Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力