在Android系统,每个应用程序是由多个Activity和Service部件,这些Activity和Service有可能在相同的处理被执行,此外,还可以在不同的过程中进行。

然后。不是在同一个过程Activity或者Service是怎样通信的呢?这就是本文中要介绍的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学习启动篇一文中提到《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机制是最难理解的了,而Binder机制不管从系统开发还是应用开发的角度来看。都是Android系统中最重要的组成。因此。非常有必要深入了解Binder的工作方式。要深入了解Binder的工作方式,最好的方式莫过于是阅读Binder相关的源码了,Linux的鼻祖Linus Torvalds以前曰过一句名言RTFSC:Read The Fucking Source Code。

虽说阅读Binder的源码是学习Binder机制的最好的方式。可是也绝不能打无准备之仗,由于Binder的相关源码是比較枯燥无味并且比較难以理解的,假设可以辅予一些理论知识,那就更好了。闲话少说,网上关于Binder机制的资料还是不少的,这里就不想再具体写一遍了。强烈推荐以下两篇文章:

Android深入浅出之Binder机制

Android Binder设计与实现 – 设计篇

Android深入浅出之Binder机制一文从情景出发。深入地介绍了Binder在用户空间的三个组件Client、Server和Service Manager的相互关系。Android Binder设计与实现一文则是具体地介绍了内核空间的Binder驱动程序的数据结构和设计原理。非常感谢这两位作者给我们带来这么好的Binder学习资料。总结一下。Android系统Binder机制中的四个组件Client、Server、Service Manager和Binder驱动程序的关系例如以下图所看到的:

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接口的能力

至此。对Binder机制总算是有了一个感性的认识,但仍然感到不能非常好地从上到下贯穿整个IPC通信过程,于是。打算通过以下四个情景来分析Binder源码,以进一步理解Binder机制:

1. Service Manager是怎样成为一个守护进程的?即Service Manager是怎样告知Binder驱动程序它是Binder机制的上下文管理者。

2. Server和Client是怎样获得Service Manager接口的?即defaultServiceManager接口是怎样实现的。

3. Server是怎样把自己的服务启动起来的?Service Manager在Server启动的过程中是怎样为Server提供服务的?即IServiceManager::addService接口是怎样实现的。

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接口源码分析。

新浪微博罗:http://weibo.com/shengyangluo,欢迎关注!

Android进程间通信(IPC)机制Binder简介和学习计划的更多相关文章

  1. [置顶] 深入理解android之IPC机制与Binder框架

    [android之IPC机制与Binder框架] [Binder框架.Parcel.Proxy-Stub以及AIDL] Abstract [每个平台都会有自己一套跨进程的IPC机制,让不同进程里的两个 ...

  2. Android资源管理框架(Asset Manager)简介和学习计划

    Android该应用程序包括两个部分组成的:代码和资源. 资源主要是与UI相关的东西,例如UI布局.和其他字符串和照片.代码和资源可以使独立的应用程序来组织的实际需求的基础上,在执行的时候UI.,就能 ...

  3. Android IPC机制—Binder的工作机制

    进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...

  4. [转]Android进程间通信--消息机制及IPC机制实现

    Android为了屏蔽进程的概念,利用不同的组件[Activity.Service]来表示进程之间的通信! 组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Servi ...

  5. Android之IPC机制

    Android IPC简介 任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来实现IPC,还 ...

  6. IPC机制--Binder

    文章来自 Android技术内幕 系统卷 转:http://www.linuxidc.com/Linux/2011-08/40508.htm 什么是IPC机制以及IPC机制的种类 在Linux中,是以 ...

  7. Android的IPC机制(一)——AIDL的使用

    综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...

  8. Anciroid的IPC机制-Binder概述

    在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...

  9. Android进程间通信IPC

    一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...

随机推荐

  1. Swift - 下标脚本方法介绍及实例

    定义下标脚本之后,可以使用“[]”来存取数据类型的值. 示例1:实现一个我们自定的字符串类,可以方便的通过索引获取某一个字符值,或某一部分字符串.同时也可以通过索引,给某一部分赋值. 1 2 3 4 ...

  2. Missing artifact net.sf.json-lib:json-lib:jar:2.2.3:compile

    json-lib是需要区分jdk版本的,pom.xml中的配置应加上<classifier>标签,如用jdk15: <dependency> <groupId>ne ...

  3. Spark&amp;Spark性能调优实战

    Spark特别适用于多次操作特定的数据,分mem-only和mem & disk.当中mem-only:效率高,但占用大量的内存,成本非常高;mem & disk:内存用完后,会自己主 ...

  4. Selenium来抓取动态加载的页面

    一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取.在我写的爬虫框架webmagic里也使用了HttpClient来完成这样的任务. 但是有些页面是通过js以及a ...

  5. drupal 7 模块开发,hook_form

    因为不是系统学习,只能把每天自己学习到的东西零碎的记录下来. 一来方便自己记忆,二来可供大家查阅. 后续有精力再去做进一步的整理. 1 开发一个模块分为有下面几个文件 hook.admin.inc h ...

  6. SetCapture ReleaseCapture

    函数功能:该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有一个窗体捕获鼠标.假设鼠标光标在还有一个线程创建的窗体 ...

  7. C++中的#pragma 预处理指令详解

    源地址:http://blog.csdn.net/roger_77/article/details/660311 在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态 ...

  8. .idata数据的解析

    每类Section代表不同的数据,不同的数据存储组织方式一定是有非常大区别的.代码段与资源段一定区别巨大,这意味着我需要一个一个的学习每个段的解析. idata段解析 这个段主要存储的是导入符号信息. ...

  9. hdu 2838 Cow Sorting(树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  10. [ACM] poj 1258 Agri-Net (最小生成树)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37131   Accepted: 14998 Descri ...