Android110221:Android binder,parcel和service的简记 (2)
概述
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层,如图<binder arch>。
最下层是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<INTERFACE>;从BpRefBase派生出了包含成员BpBinder对象的远端关键类BpInterface<INTERFACE>。
于是,创世纪中,神说:‘要有光’,就有了光。神看光是好的,就把光暗分开了。 神称光为昼,称暗为夜。有晚上,有早晨,这是头一日。
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。
分享到:
相关推荐
模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo模拟binder通信的demo...
标题中的“move android binder to linux”意味着我们要探讨的是如何将Android系统的Binder通信机制移植到Linux环境中。Binder是Android系统中的核心组件,它负责进程间通信(IPC,Inter-Process Communication),...
**Binder的核心数据结构**包括`binder_work`、`binder_node`、`binder_ref`、`binder_buffer`、`binder_proc`等,它们共同构建了Binder机制的基础框架。 1. **binder_work** - 表示一个工作项,用于记录和跟踪...
### Android Binder机制核心思想分析 #### 一、引言 Binder机制是Android系统中实现进程间通信(IPC)的关键技术,其设计精妙且高效,是Android架构中不可或缺的一部分。Binder不仅作为Android系统中各组件间通信...
Resource Binder v3.1是一款强大的EXE资源优化与重建工具,专为IT专业人士设计,用于处理PE(Portable Executable)文件格式的资源管理。这款工具的主要功能是帮助用户对程序的资源部分进行编辑、更新和优化,从而...
3. sdkserver是binder服务(编译后生成sdkserver二进制),sdklib是binder的client(编译生成so),sdkclient(编译生成bin)是用来测试sdklib的。 4. 编译完成后把两个bin文件放到andoid系统的/system/bin目录下,...
Android的Binder机制是其独特的进程间通信(IPC)方式,主要负责Android系统中服务与服务、应用与服务之间的通信。本文将深入解析Binder在Java层和C++层的实现,并通过一个简单的模拟示例来阐述如何在不同进程中进行...
【Binder设计与实现】 Binder是Android系统中独特的进程间通信(IPC)机制,相较于Linux已有的管道、System V IPC和socket等,Binder具有显著的优势。理解Binder的工作原理和设计细节对于提升Android应用的性能和...
在Android系统中,Binder是进程间通信(IPC,Inter-Process Communication)的主要机制,它使得应用程序之间能够共享数据和服务。"Binder连接池"是优化Binder通信的一种策略,它通过复用已经建立的Binder连接,提高...
在Android系统中,Binder是进程间通信(IPC, Inter-Process Communication)的主要机制,它使得应用程序之间可以共享数据和服务。而Binder连接池的概念是针对频繁使用AIDL接口进行IPC操作时,为了提升性能和减少资源...
在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的关键技术,它是一种轻量级的通信机制,使得应用可以跨越进程边界,与系统服务或者其他应用进行数据交换。下面,我们将深入探讨...
在Android系统中,Binder是实现进程间通信(IPC, Inter-Process Communication)的关键机制,它允许不同进程间的对象互相调用方法,实现了跨进程的数据交换和服务交互。本篇将深入探讨如何利用Android Interface ...
在Android系统中,Binder是进程间通信(IPC,Inter-Process Communication)的主要机制,它使得应用程序和服务能够跨进程交换数据和执行操作。本篇将详细探讨`Android binder_test`的相关知识点,包括Binder的工作...
在Android系统中,IPC(Inter-Process Communication)是不同进程间通信的一种机制,而Binder是Android IPC的核心组件。本文将深入探讨"IPC方式之Binder连接池"这一主题,结合提供的DEMO实例,帮助你更好地理解和...
在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的关键技术,它是一种轻量级的通信机制,使得应用程序之间可以共享服务和数据。本篇将通过一个学习实例来深入理解Android Binder的...
在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的核心机制,而AIDL(Android Interface Definition Language)则是简化Binder使用的接口定义语言。以下是对"Binder学习的一些小项目...
Android Binder机制完全解析 在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的关键技术,它是Android系统服务和应用程序之间交互的主要方式。深入理解Binder机制对于Android应用...
C++ Binder通信是Android系统中进程间通信(IPC)的核心技术,它允许不同进程之间高效地交换数据和调用服务。在这个实例中,我们将探讨如何使用C++来实现Binder客户端和服务端。 首先,理解Binder机制的基本概念至...