Android进程间通信机制Binder
本文一开始记载的是阅读Android进程间通信(IPC)机制Binder简要介绍和学习计划后的纲要提炼,后面通过看视频及其他文章后自己对binder机制做新的描述以便令读者更容易的理解binder通信机制。
在Android应用程序启动过程源代码分析文章中我们可以了解到一个Activity的启动是各进程间通过Binder的转接使应用程序于新的ActivityThread实例中运行起来,详细如下:
一:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
二:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
三:Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;
四:ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
五:ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。
从上面可以看出binder机制在android源码中起着非常重要的作用,现在来了解下 进程间通信(IPC)机制Binder,重点说明下是进程间的通信,大家都知道进程比线程大,所以binder机制作用在线程间的通信是完成没有问题的。另外支撑这个Binder机制的是Binder驱动,这个暂不在本文做详细的说明。
首先要知道Binder的作用:在Android中,
Binder的主要作用是连接三个组件:Client、Server和Service Manager。
进程A要与进程B通信,那么这个时候进程A就是Client,进程B就是Server,Service Manager就是协助者。
然后我们了解下四者间关系,如图:
从图中大家应该能看出其实Client/Server/Service Manager是在用户空间中,binder则是在内核中运行,那么到底他们是怎么进行通信的呢?
我们要知道 Server会在Service Manager中注册(可以理解为记录了一个标识如:"0x1234"),每当Client向Service Manager中请求获取与Server通信的时候,Service Manager就会将这个标识"0x1234"返回给Client。Client就可以通过标识“0x1234”使用Binder驱动去和Server进行通信。如下图:
通过上面的两个图和描述大家应该知道Client/Server/Service Manager和binder的关系了,但是感觉还是不是清楚到底binder是如何进行这个进程间通信的,那么我们来看下面的图
Server有个Object对象的add方法,向Service Manager注册了,Client想调用,那么就会跟Service Manager请求获取对象进,然后Service Manager就会给Client一个Server的代理对象(因为是跨进程,无法给到一个真实的)。然后client调用代理对象的add方法,binder驱动一看是代理对象就知道Service Manager中表记录真实对象在哪,这时binder就会调用真实的Server的add方法。
提要:
1. Client、Server和Service Manager实现在用户空间中,Binder驱动程序实现在内核空间中
2. Binder驱动程序和Service Manager在Android平台中已经实现,开发者只需要在用户空间实现自己的Client和Server
3. Binder驱动程序提供设备文件/dev/binder与用户空间交互,Client、Server和Service Manager通过open和ioctl文件操作函数与Binder驱动程序进行通信
4. Client和Server之间的进程间通信通过Binder驱动程序间接实现
5. Service Manager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力
6. 进程间通信的时候Client持有的是Server的代理对象
如对binder机制想更细化的了解可通过下面的文章中逐一了解
1.浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
2.浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
3.Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
4.Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
5.Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析