[Binder学习篇一:初识Binder] Android进程间通信(IPC)之Binder机制简要介绍[转]
在Android系统中,每一个应用程序都由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程,也有可能运行在不同的进程中。那么,不在同一个进程的Activity和Service如何进行通信呢?这就是本文要介绍的Binder通信机制。
我们知道,Android系统是基于Linux内核的,而Linux内核集成和兼容了丰富的Unix系统进程间通信(IPC)机制。有传统的管道(Pipe),信号(Signal)和跟踪(Trace),这三项通信手段只能用于父子进程之间或者兄弟进程之间。【信号的使用虽然未限制在父子进程之间,但是发送信号时需要用到对方的pid,而一般只有父子进程之间才能知道对方的pid】。后来又增加了命名管道(Named Pipe)使得进程通信不在局限于父子进程或兄弟进程之间;为了更好地支持商业应用中的事务处理,在AT&T的Unix System V中,又增加了三种称为“System V IPC”的进程间通信机制,分别是消息(Message),共享内存(Share Memory)和信号量(Semaphore);后来BSD Unix对“System V IPC”机制进行了重要的扩充,提供了一种称为套接字(Socket)的进程间通信机制。详细内容参考《Linux内核源码情景分析》一书。
但是,Android并没有采用上述提到的各种通信机制,而是采用了Binder机制,难道是因为考虑了移动设备硬件性能较差,内存较低的特点?不得而知。Binder其实也不是Android提出来的一套新的进程间通信机制,它是基于OpenBinder来实现的。OpenBinder最先是由Be Inc.开发的,接着Palm Inc.也跟着使用。现在OpenBinder的作者Dianne Hackborn就是在Google工作,负责Android平台的开发工作。
前面一再提到,Binder是一种进程间通信机制,它是一种类似于COM和CORBA分布式组件框架,通俗一点,其实是提供远程过程调用(RPC)功能。从英文字面上意思看,Binder具有粘结剂的意思,那么它是把什么东西粘在一起呢?在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不得不学—LZ感悟】Read The Fucking Source Code — Linus Torvalds。
推荐文章:
Android深入浅出纸Binder机制一问从情景出发,深入地介绍了Binder在用户空间的三个组件Client、Server、Service Manager的相互关系。后期LZ也会通过边读边写的方式,对该文进行转载重写。

1. Client、Server和Service Manager实现在用户空间,Binder驱动程序实现在内核空间
2. Binder驱动程序和Service Manager在Android已经实现,开发者只需要在用户空间实现自己的Client和Server
3. Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctrl文件操作函数和Binder驱动程序通信
4. Client和Server之间的进程通信通过Binder驱动程序间接实现
5. Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力
至此,对Binder机制有一个感性的认识,但仍然无法很好地从上到下贯穿整个Binder机制,于是,通过以下四个情景分析Binder源代码:
1. Service Manager是如何成为一个守护进程的?即Service Manager是如何告知Binder驱动程序它是Binder机制的上下文管理者。
2. Server和Client是如何获得Service Manager接口的?即defaultServiceManager接口是如何实现的。
4. Service Manager是如何为Client提供服务的?即IServiceManager::getService接口是如何实现的。
在接下来的四篇文章中,将按照这四个情景来分析Binder源代码,都将会涉及到用户空间到内核空间的Binder相关源代码。这里为什么没有Client和Server是如何进行进程间通信的情景呢? 这是因为Service Manager在作为守护进程的同时,它也充当Server角色。因此,只要我们能够理解第三和第四个情景,也就理解了Binder机制中Client和Server是如何通过Binder驱动程序进行进程间通信的了。
为了方便描述Android系统进程间通信Binder机制的原理和实现,在接下来的四篇文章中,我们都是基于C/C++语言来介绍Binder机制的实现的,但是,我们在Android系统开发应用程序时,都是基于Java语言的,因此,我们会在最后一篇文章中,详细介绍Android系统进程间通信Binder机制在应用程序框架层的Java接口实现:
5. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析。
转自:老罗(此老罗非彼老罗)

浙公网安备 33010602011771号