在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. 14.3.2.1 Transaction Isolation Levels 事务隔离级别

    14.3.2 InnoDB Transaction Model InnoDB 事务模型 14.3.2.1 Transaction Isolation Levels 事务隔离级别 14.3.2.2 au ...

  2. html name id, 与服务器交互必须有name

    html name id, 与服务器交互必须有name 在HTML中元素的ID和Name的区别和联系. 今天写了个测试,在php脚本里怎么也获取不到$_POST['userName']的值,经检查在h ...

  3. extjs desktop startmenu (開始菜单)

    extjs desktop 的開始菜单 二级菜单,仅仅是简单演示实现原理,如 须要动态生成,自己改造就可以,下面基本方法原理: 首先 建立一个js文件 生成開始菜单数据:  function Get ...

  4. 使用HashMap须要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()

    Map/HashMap是java中一种非经常常使用的数据结构,一般我们在应用中做的事情就是调用put向容器写入数据或者是get从容器读取数据. Map.entrySet()这种方法返回了键值对的集合, ...

  5. Android APP代码拨打电话、打开手机分享功能等隐式意图

    Android APP拨打电话: Intent intent=new Intent(Intent.ACTION_DIAL,Uri.parse("tel:"+110)); start ...

  6. Java程序猿面试题集(181- 199)

    Java面试题集(181-199) 摘要:这部分是包括了Java高级玩法的一些专题,对面试者和新入职的Java程序猿相信都会有帮助的. 181.  182. 183. 184. 185. 186. 1 ...

  7. 不知道的JavaScript

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章  初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目吸 ...

  8. Centos 6安装完美搭建mysql、php、apache之旅

    安装apache [root@centos share]# yum -y install httpd Loaded plugins: fastestmirror, refresh-packagekit ...

  9. scala akka 修炼之路5(scala特质应用场景分析)

    scala中特质定义:包括一些字段,行为(方法/函数/动作)和一些未实现的功能接口的集合,能够方便的实现扩展或混入到已有类或抽象类中. scala中特质(trait)是一个非常实用的特性,在程序设计中 ...

  10. Selenium执行测试脚本稳定性的一些经验分享交流

    Selenium执行测试脚本稳定性的一些经验分享交流 公司的自动化WEB测试框架IATA已上线运行了一段时间,期间发现一些脚本稳定性的问题,与大家分享一下. CASE执行游览器:ie firefox ...