- 浏览: 14418 次
最新评论
Android IPC进程间通讯机制
2011年06月17日
一.Linux系统进程间通信有哪些方式? 1.socket; 2.name pipe命名管道; 3.message queue消息队列; 4.singal信号量; 5.share memory共享内存;
二.Java系统的通信方式是什么? 1.socket; 2.name pipe;
三.Android系统通信方式是什么? Binder 通信;
四.Binder通信的优势是什么? 高效率
五.Binder通信的特点是什么? 是同步,而不是异步;
六.Binder通信是如何实现的?
1.Binder通信是通过linux的binder driver来实现的,
2.Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回;
3.Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。
七. Android中的 Binder通信实现要点:
1. Android中的Binder通信是基于Service与Client的工作模型的;
2. 所有需要IBinder通信的进程都必须创建一个IBinder接口;
3. 系统中有一个进程管理所有的system service:
4. Android不允许用户添加非授权的System service;
5. 现在源码开放了,我们可以修改一些代码来实现添加底层system Service的目的;
6. 对用户程序来说,我们也要创建server,或者Service用于进程间通信;
7. ActivityManagerService管理JAVA应用层所有的service创建与连接(connect),disconnect;
8. 所有的Activity也是通过这个service来启动,加载的;
9. ActivityManagerService也是加载在Systems Servcie中的;
八.Android的 Service工作流程
1.Android虚拟机启动之前系统会先启动service Manager进程;
2.service Manager打开binder驱动,并通知binder kernel驱动程序这个进程将作为System Service Manager;
3.然后该进程将进入一个循环,等待处理来自其他进程的数据。
4.用户创建一个System service后,通过defaultServiceManager得到一个远程ServiceManager的接口,通过这个接口我们可以调用addService函数将System service添加到Service Manager进程中;
5.然后client可以通过getService获取到需要连接的目的Service的IBinder对象,这个IBinder是Service的BBinder在binder kernel的一个参考,
6.所以service IBinder 在binder kernel中不会存在相同的两个IBinder对象,每一个Client进程同样需要打开Binder驱动程序。对用户程序而言,我们获得这个对象就可以通过binder kernel访问service对象中的方法。
7.Client与Service在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用Service返回的IBinder接口后,访问Service中的方法就如同调用自己的函数。
Email: zcatt@163.com
Blog http://zcatt.cublog.cn
内容提要
文档简要整理binder,parcel,和service的内容。以供备忘和参考。
声明
仅限学习交流,禁止商业用途。转载需注明出处。
版本记录
Date Ver Note
2011-02-21 0.1 Draft. zcatt, Beijing
1. binder的结构
binder是解决ipc和rpc的工具。android使用的是linux os,支持多进程和多线程。同时,对于java app,一个vm占用一个进程。做为完善的开发框架,android必须支持ipc。binder就是解决ipc问题的途径,更进一步,binde还支持rpc。
进程有自己的地址空间,不同进程间的通信并不能直接引用地址。一般的解决途径是,发送进程把需要传送的数据按照一定格式(marshall)转换成二进制形式/特定格式的数据,发往接收进程;接收进程收到二进制形式、特定格式的数据后,反转换(unmarshall)成原文数据,然后使用。binder使用的就是这种步骤。
binder使用的是同步c/s模型,s循环阻塞在接收数据操作上,随时处理c的数据,处理后发送回c;c则将请求服务的数据发送到s,阻塞在收取s返回数据,收到数据后,继续自己的工作。
binder的框架可以分成3层,如图。
最下层是linux os和binder driver。binder driver本质上是进程间的共享内存,各进程将要发送到其它进程的数据写入到driver,从driver读取其它进程发送来的数据。
中间层是cpp实现的framework,完成数据的接收发送转换,和c/s流程的支持。
其实到中间层,binder的架构就已经完全具备了。但android使用的是java做为一般app的开发语言。所以还需要jni和相应java binder类的支持,这就是中间层上面的第三层:jni/java
假设c,s都是java实现,app ipc一般的情景是这样的, app client 收集ipc的数据,穿过jni,加工下传,经framework,写入driver。数据经driver上传,反加工经framework,穿过jni,上传到app server。
对于rpc的支持,需要一点点技巧,直接传递函数指针是无法使用的。为了是叙述的方便,先澄清一对概念:本地local和远端remote。定义rpc函数的进程称作本地,调用rpc函数的进程称作远端。rpc的实现实际上是远端定义一个rpc的proxy,远端将proxy想做rpc在本地的实现,貌似本地函数操作一般使用。而这个proxy实际上仅仅是将自己登记在本地的handle和入口参数发送本地,本地根据handle,知晓是哪个远端进程的proxy,调用函数,给定入口参数,执行完毕后,将出口参数再返回远端的proxy(因为我们有handle了)。binder的实现中handle和本地函数的对应关系是保存在driver中管理的。
2. binder driver
binder driver是binder机制的基础,是实现ipc的通道。
binder driver与framework和app的功能操作是用ioctl方式实现的。最基本的操作是数据读写操作。一次读写操作有两个子操作组成:写子操作和读子操作。driver为每个进程和线程维护了一个数据结构,其中有一个list,挂接了其它进程写入的数据,还有一个信号量。写子操作负责将数据挂接到接收进程对应数据结构的list上。读子操作负责处理自己进程中list上的数据,传回framework和app。
binder driver的第二个功能是为了支持rpc,就是维护本地函数和远端proxy的handle之间的对应关系。更复杂的是维护两个远端Proxy的handle之间的对应关系,这两个proxy是同一rpc的proxy。
3. binder framework
binder的framework是cpp实现的,这里分成本地local/s和远端remote/c两半来描述。
公共类IBinder派生出两个子类,BBinder用于local,BpBinder用于remote。
本地实现的类以BBinder为基类派生,接收数据后,处理,并将结构发会远端。
远端proxy的类使用BpBinder,接收和发送数据到本地。
进一步方便开发,引入了IInterface类,开发者从Interface派生子类,定义自己需要的rpc操作。
在IInterface的装饰下,从BBinder派生出了本地的关键类 BnInterface;从BpRefBase派生出了包含成员BpBinder对象的远端关键类BpInterface。
于是,创世纪中,神说:'要有光',就有了光。神看光是好的,就把光暗分开了。 神称光为昼,称暗为夜。有晚上,有早晨,这是头一日。
4. binder jni,java类和aidl工具
binder framework的机制要被java使用,需要经过包装。除了jni相关部分,android在java中还定义了几个相关的接口和类,IBinder,Binder,BinderProxy,IInterface,BinderInternal。
aidl工具则是方便java实现c/s结构的一个工具,开发者编写简单的接口描述idl文件,则aidl自动生成local和remote的Binder类。让开发者关注在实际的功能开发上,不必为binder机制耗费无谓的精力。
5. parcel是什么
为了便于ipc之间传递的数据的操作,binder引入了parcel的概念。parcel可以想成快递公司的包装箱,需要传递的各种类型的数据都被打包进parcel类,binder负责传递parcel对象,接收端则从parcel解出数据。这样的机制即减少了各种数据类型对传递的复杂性,又可以通过增加打包/解包parcel的数据类型,轻易实现扩展。
parcel已经支持容纳基本数据类型和一些复合数据类型。
在framework层面,parcel提供了Flattenable基类,可以扩展parcel容纳的数据类型。
在java parcel层面,parcel提供了Parcelable接口,可以扩展parcel容纳的数据类型。
6. 依赖于binder的service
ipc/rpc已经被binder机制解决掉了,那么service面临的唯一问题就是service如何让想使用service的client招到service。解决的方案就是 service manager。service manager是一个特殊进程,每个service都会注册登记到service manager中,而client可以从service manager查询得到自己需要使用的service。
发表评论
-
TCP长连接服务的Java实现
2012-01-20 00:49 1502TCP长连接服务的Java实现 ... -
Java 开发员AJAX 常见问题
2012-01-20 00:49 600Java 开发员AJAX 常见问题 ... -
说说IO - IO的分层
2012-01-20 00:49 671说说IO - IO的分层 2011年 ... -
使用 libevent 和 libev 提高网络应用性能
2012-01-20 00:49 1449使用 libevent 和 libev 提 ... -
i9001
2012-01-17 01:07 753i9001 2011年12月13日 一、外观检查,外壳、 ... -
从零开始- Android刷机指南<一>
2012-01-17 01:07 749从零开始- Android刷机指南 2011年07月27日 ... -
接上一篇
2012-01-17 01:07 653接上一篇 2011年04月25日 第 2 章 路由器基 ... -
ARM经典100问
2012-01-17 01:07 807ARM经典100问 2011年03月13日 第1章 体系 ... -
libevent源码深度剖析四
2012-01-15 19:48 630libevent源码深度剖析四 ... -
valgrind结果查看
2012-01-15 19:48 519valgrind结果查看 2011年12月30日 程序示 ... -
给大学生学习ARM和FPGA的建议(转)
2012-01-15 19:48 614给大学生学习ARM和FPGA的 ... -
教大家S40/java所有玩机技巧,喜欢请转载 加QQ657752021学习更多技术
2012-01-15 19:48 856教大家S40/java所有玩机 ... -
【下一页】linux(部分)
2012-01-15 19:48 713【下一页】linux(部分) 2012年01月09日 一 ... -
第2章 saas 成熟度模型-悟空悟道-iteye技术网站
2012-01-11 12:02 534第2章 saas 成熟度模型-悟空悟道-iteye技术网站 ... -
使用 JavaScript 获取 table 行号和列号
2012-01-11 12:02 796使用 JavaScript 获取 table 行号和列号 2 ... -
Extending Ext
2012-01-11 12:02 601Extending Ext 2011年07月01日 fr ... -
ReflectionUtils
2012-01-11 12:02 677ReflectionUtils 2011年07月01日 ... -
JPA中复合主键的映射
2012-01-11 12:01 548JPA中复合主键的映射 2011年07月01日 在航空系 ...
相关推荐
Android进程间通信(IPC)机制Binder简要介绍和学习计划
这是一个IPC进程间AIDL方式通信的简单Demo。包括服务端和客户端。目的在于协助该博客讲解binder与service之间跨进程通信机制。所有大家读源码时务必同时读该博客。 ...
【一图流】_02_一张图看懂 Android 进程间通信(IPC)Binder机制: 此图表述了Android系统_进程间通信(IPC)机制全部体系,其中重点放在 Android系统中 重用 的 Binder机制 上,详尽细致,希望对大家有用;
介绍关于ipc 进程间通信原理,android中binder运行机制
浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
关于android系统的进程间通信,详细说明了android是如何管理消息机制,如果进行进程间的通信。
android应用程序理所当然可以应用JAVA的IPC机制实现进程间的通信, 取而代之的是Binder通信。Google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。 Binder通信是通过linux的binder driver来实现的。...
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
IPC analysis on android with a demo (基于IPC实例分析android IPC机制) 代码分析,请参考:http://blog.csdn.net/safrans/article/details/6272652
上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client、Server、Service Manager和驱动程序Binder四个组件构成。本文着重介绍组件...
Android之通过AIDL机制实现进程间的通讯实例,详见http://blog.csdn.net/lvxiangan/article/details/52756199
在前面一篇文章Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路中,介绍了在Android系统中Binder进程间通信机制中的Server角色是如何获得Service Manager远程接口的,即...
AIDL:Android Interface Definition Language,即Android接口定义语言,用于生成Android不同进程间进行进程通信(IPC)的代码,一般情况下一个进程是无法访问另一个进程的内存的。如果某些情况下仍然需要跨进程访问内存...
在前面一篇文章浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路中,介绍了Service Manager是如何成为Binder机制的守护进程的。既然作为守护进程,Service Manager的职责当然就是为Server和...
这就是本文中要介绍的Binder进程间通信机制了。 我们知道,Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。有传统的管道(Pipe)、信号(Signal)和跟踪(Trace),...
在上一篇文章中,我们分析了Android系统进程间通信机制Binder中的Server在启动过程使用Service Manager的addService接口把自己添加到Service Manager守护过程中接受管理。在这一篇文章中,我们将深入到Binder驱动...