AndroidIPC进程间通讯机制_第1页
AndroidIPC进程间通讯机制_第2页
AndroidIPC进程间通讯机制_第3页
AndroidIPC进程间通讯机制_第4页
AndroidIPC进程间通讯机制_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AndroidIPC 进程间通讯机制Android IPC 进程间通讯机制 分类: Android一.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: Blog 内容提要 文档简要整理 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. 依赖于 bi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论