Android中的IPC binder机制

合集下载

android binder stub. 的理解

android binder stub. 的理解

在Android 操作系统中,Binder 是一种用于进程间通信(IPC)的机制。

Binder 机制允许一个进程的代码调用另一个进程中的代码,通常在Android 中用于实现不同应用程序组件(例如服务)之间的通信。

在Binder 机制中,有两个主要的角色:Binder 服务和Binder 客户端。

Binder 服务通常运行在一个独立的进程中,而Binder 客户端则希望与服务进行通信。

为了进行通信,服务需要提供一个Binder 接口,而客户端需要获取到该接口以调用服务提供的方法。

这就涉及到Binder Stub。

Binder Stub:Binder Stub 是一个在客户端进程中的代理对象,用于代表服务端的实际对象。

在Android 中,Stub 通常是由系统自动生成的,并负责处理客户端发起的远程调用请求。

当客户端调用Binder 接口中的方法时,实际的工作是由Stub 完成的。

具体而言,Binder Stub 的工作包括:1. 接收远程调用请求:当客户端调用Binder 接口的方法时,实际上是通过Binder Stub 发送远程调用请求到服务端的对应Binder 对象。

2. 序列化和反序列化参数:Binder Stub 负责将客户端传递的参数序列化为二进制数据,并将服务端返回的结果反序列化为适当的数据类型。

3. 将请求发送到服务端:Binder Stub 将序列化后的请求发送到服务端,并等待服务端的响应。

4. 接收并处理服务端的响应:一旦服务端处理完请求,它将结果序列化并通过Binder Stub 发送回客户端。

5. 通知客户端调用完成:Binder Stub 负责通知客户端,使其能够继续执行。

在整个过程中,Binder Stub 充当了客户端和服务端之间的桥梁,隐藏了底层IPC 细节,使得远程调用就像本地调用一样。

这样,客户端不需要了解服务端的实际实现,而只需要通过Binder 接口与Stub 进行交互。

异步binder原理

异步binder原理

异步binder原理在Android 中,Binder 是用于跨进程通信的IPC(Inter-Process Communication)机制。

当谈到异步Binder 时,通常指的是Binder 中的异步消息传递机制。

这是通过使用`Handler` 和`Message` 实现的。

以下是异步Binder 的基本原理:1. Handler 和Message:在Android 中,`Handler` 是用于处理消息的机制,而`Message` 是消息的数据载体。

在异步Binder 中,每个进程都有一个`Handler` 与其相关联,用于处理异步消息。

`Message` 中包含了要发送的数据、目标`Handler` 等信息。

2. AIDL 接口:异步Binder 的使用通常涉及到AIDL(Android Interface Definition Language)接口定义。

通过AIDL,可以定义跨进程通信所需的接口方法和数据类型。

生成的AIDL 文件将在客户端和服务端之间进行通信。

3. 客户端和服务端通信流程:-客户端:-客户端通过AIDL 接口提供的方法创建一个`Message` 对象,并将其发送给服务端的`Handler`。

-客户端可以通过`Handler` 的`sendMessage` 方法发送消息,或者通过`sendXXX` 系列方法发送带有回调的异步消息。

-服务端:-服务端在`onCreate` 方法中创建一个`Handler` 对象,并处理从客户端发送过来的消息。

-服务端通过实现AIDL 接口提供的方法,执行相应的操作,然后通过客户端提供的`IBinder` 对象向客户端发送异步消息。

-客户端的`Handler` 接收到异步消息后,执行相应的回调操作。

4. 异步回调:为了在异步Binder 中实现异步回调,通常使用`Binder` 对象的`linkToDeath` 方法监听客户端的死亡(crash)事件,以便在客户端死亡时进行相应的处理。

android_IPC及原理简介

android_IPC及原理简介

什么是Android操作系统,所谓的Android:是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发。

Linux系统中进程间通信的方式有:socket, named pipe,message queque, signal,share memory。

Java系统中的进程间通信方式有socket, named pipe等。

android应用程序理所当然可以应用JAVA的(IPC Inter Process Communications)机制实现进程间的通信,取而代之的是Binder通信。

Google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。

Binder通信是通过linux的binder driver来实现的。

Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。

Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC 以及执行进程本地消息,Binder通信是同步而不是异步。

Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。

系统中有一个进程管理所有的system service,Android虚拟机不允许用户添加非授权的System service,当然现在源码开发了,我们可以修改一些代码来实现添加底层system Service 的目的。

对用户程序来说,我们也要创建server,或者Service用于进程间通信,这里有一ActivityManagerService管理JAVA应用层所有的service创建与连接(connect)。

disconnect,所有的 Activity也是通过这个service来启动,加载的。

binder代码解析

binder代码解析

binder代码解析概述本文将对bi nd er代码进行解析,介绍它的作用、原理以及使用方法等相关内容。

bi nd er是一种用于跨进程通信的机制,它可以在不同的A n dr oi d组件之间进行数据传递和函数调用,极大地方便了应用程序的开发。

什么是bind er?b i nd er是A nd ro id系统中实现进程间通信(IP C)的核心机制之一。

它通过提供客户端和服务端的桥梁,使得不同进程中的组件可以相互交互和通信。

binde r的工作原理b i nd er的工作原理可以简单地分为以下几个步骤:1.创建服务端:服务端是通过继承`Bin d er`类并实现相应功能的方式来创建的。

服务端提供了一系列可以跨进程调用的方法。

2.创建客户端:客户端需要通过`S er vi c eC on ne ct io n`接口与服务端建立连接,并通过系统调用来获取服务端的`Bi nd er`对象。

3.调用远程方法:客户端通过获得的`B i nd er`对象,可以调用服务端提供的方法。

这些方法会被代理到服务端执行,然后将结果返回给客户端。

4.传输数据:在进行远程方法调用时,数据需要进行传输。

b i nd er使用`P ar ce l`类来进行数据的序列化和反序列化,保证数据的安全性和完整性。

binde r的使用方法使用bi nd er的基本步骤如下:1.创建服务端类:创建一个类继承`Bin d er`,并实现需要跨进程调用的方法。

2.注册服务端:在`A n dr oi dM an if es t.x m l`文件中声明服务端,并指定相应的`Se rv ice`类。

3.创建客户端类:创建一个类,通过`S e rv ic eC on ne ct ion`接口与服务端建立连接,并获取服务端的`Bi nd er`对象。

4.调用远程方法:通过获得的`Bi nd er`对象,可以调用服务端提供的方法。

5.解除绑定:使用`u n bi nd Se rv ic e()`方法解除客户端与服务端的连接。

binder线程池工作原理

binder线程池工作原理

Binder线程池工作原理1. 概述Binder线程池是Android系统中的一个核心组件,用于处理进程间通信(IPC)的请求。

在Android系统中,多个进程之间需要进行信息交互和资源共享,Binder线程池扮演着重要角色,确保进程间通信的高效和安全。

2. Binder线程池的作用Binder线程池主要负责管理和分发Binder请求,并将请求传递给相应的Binder驱动程序。

它的作用可以概括为以下几个方面: - 提供线程池:Binder线程池维护了一个线程池,用于处理Binder请求。

通过线程池的管理,可以确保多个请求能够同时进行,提高系统的并发处理能力。

- 处理Binder请求:当一个进程需要向另一个进程发送请求时,可以通过Binder线程池进行处理。

线程池会将请求加入队列,并通过线程调度机制选择一个线程来处理请求。

- 中转请求:Binder线程池还起到中转的作用,将进程间的Binder请求发送给Binder驱动程序进行处理。

这个过程中,Binder线程池通过与驱动程序进行交互,完成IPC的过程。

3. Binder线程池的工作原理Binder线程池的工作原理主要包括请求入队、线程调度和请求处理三个步骤。

3.1 请求入队当一个进程发起Binder请求时,请求会首先进入Binder线程池的请求队列中。

在请求入队的过程中,会根据请求的优先级进行排序。

较高优先级的请求会被先处理,以保证关键请求的及时响应。

请求队列的管理是使用多线程与互斥锁来实现的,以确保多个线程安全地对队列进行操作。

3.2 线程调度当请求进入请求队列后,Binder线程池会从线程池中选择一个合适的线程来处理请求。

线程调度主要有两个优化目标:提高响应速度和利用系统资源。

为了提高响应速度,线程调度会选择空闲的线程来处理请求,避免浪费时间在线程的创建和销毁上。

为了利用系统资源,线程调度还会根据各个线程的负载情况,选择负载较轻的线程来处理请求。

binder机制原理

binder机制原理

binder机制原理Binder机制原理。

Binder机制是Android系统中的一种进程间通信(IPC)方式,它允许不同进程之间进行数据交换和通信。

在Android系统中,各个应用程序运行在自己的进程中,它们需要进行数据共享和通信,而Binder机制就是为了解决这个问题而设计的。

Binder机制的原理可以简单概括为,Binder驱动程序、Binder通信线程和Binder通信的数据结构。

在Android系统中,Binder驱动程序负责管理Binder通信,它将用户空间的Binder通信请求转发到内核空间,并在内核空间中完成通信操作。

Binder通信线程则是在用户空间和内核空间之间进行通信的桥梁,它负责将用户空间的通信请求传递给Binder驱动程序,并将内核空间的通信结果返回给用户空间。

而Binder通信的数据结构则是用来传递和存储通信数据的,它包括Binder引用、Binder节点和Binder死亡通知等。

在Android系统中,每个进程都有一个Binder驱动程序和一个Binder通信线程,它们负责处理进程内部的Binder通信。

当一个进程需要和另一个进程进行通信时,它会通过Binder驱动程序向目标进程发送一个Binder引用,目标进程接收到Binder引用后,就可以通过Binder通信线程和目标进程进行通信。

这样,就实现了不同进程之间的数据共享和通信。

Binder机制的原理虽然看起来比较复杂,但在实际使用中,开发者只需要使用Android提供的Binder API就可以轻松实现进程间通信。

Android系统已经封装了Binder机制的底层实现,开发者只需要关注业务逻辑即可。

在Android开发中,常用的Binder通信方式包括AIDL(Android Interface Definition Language)和Messenger等,它们都是基于Binder机制实现的。

总的来说,Binder机制是Android系统中非常重要的一部分,它为不同进程之间的数据共享和通信提供了良好的解决方案。

binder 机制 深入解析

binder 机制 深入解析

binder 机制深入解析Binder 机制是 Android 系统中的一种进程间通信(IPC)机制,它允许不同进程之间进行数据交换和通信。

Binder 机制的核心是Binder 驱动程序,它提供了一种高效的进程间通信方式,使得Android 系统中的各个组件能够相互通信并协同工作。

首先,让我们从 Binder 的基本工作原理开始。

Binder 机制的核心是 Binder 驱动程序,它负责进程间通信的建立和管理。

在Binder 机制中,有三种角色,客户端、服务端和 Binder 驱动程序。

客户端通过 Binder 对象与服务端进行通信,Binder 驱动程序负责传输数据和消息。

其次,我们可以深入了解 Binder 机制的底层实现。

Binder 机制的底层实现涉及到内核空间和用户空间的交互,涉及到线程调度、内存管理等底层操作。

Binder 驱动程序通过内核提供的特殊接口与用户空间进行通信,实现进程间的数据传输和通信。

另外,我们可以探讨 Binder 机制在 Android 系统中的应用。

Binder 机制在 Android 系统中被广泛应用于各种组件之间的通信,比如 Activity 与 Service 之间的通信、不同应用程序之间的通信等。

Binder 机制的高效性和稳定性使得 Android 系统能够实现复杂的功能和交互。

此外,我们还可以讨论 Binder 机制的优势和局限性。

Binder机制的优势在于高效的进程间通信、低延迟、支持大数据传输等;而局限性在于复杂度较高、需要谨慎处理内存管理等方面。

总的来说,Binder 机制作为 Android 系统中的重要组成部分,对于进程间通信起着至关重要的作用。

通过深入解析 Binder 机制的基本原理、底层实现、应用和优劣势,我们可以更好地理解Android 系统中的进程间通信机制,为开发高效稳定的 Android 应用程序提供参考和指导。

binder 原理

binder 原理

binder 原理Binder是Android系统中的一种进程间通信(IPC)机制,用于不同进程间的对象调用和数据传输。

Binder的原理主要包括以下几个部分:1. Binder驱动:Binder驱动是Linux内核中的一部分,它提供了底层的IPC支持。

每个进程都可以通过特殊文件/dev/binder与驱动进行通信。

2. Binder机制:Binder机制通过三个重要的组件来实现进程间通信,分别是ServiceManager、Binder驱动和Binder通信框架。

- ServiceManager:ServiceManager是Binder的管理服务。

它保持对每个注册的“服务”对象的引用,并通过指定的接口名称提供对这些服务对象的访问。

- Binder驱动:Binder驱动负责处理底层的IPC通信,包括进程间的消息传递和对象的引用传递。

Binder驱动通过Binder节点(Binder Node)维护了一个全局的对象引用表,每个Binder对象都有一个唯一的Binder引用。

- Binder通信框架:Binder通信框架运行在用户态,负责进程间的通信,包括进程之间的消息传递、对象的引用传递等。

它提供了一些基本的类,如Binder、IBinder、BinderProxy等,用于实现跨进程调用、远程对象引用等功能。

3. Binder对象:在Binder机制中,对象是通过Binder对象来实现的。

每个Binder对象都实现了IBinder接口,IBinder接口定义了一些基本的操作,如查询Binder引用、跨进程调用等。

4. 跨进程调用过程:当一个进程需要调用另一个进程中的对象时,它首先从ServiceManager查询目标对象的引用。

然后,它将调用请求以消息的形式发送给目标进程。

在目标进程中,Binder驱动接收到消息后,将消息交给Binder通信框架处理。

Binder通信框架通过查询全局的对象引用表,找到目标对象并调用相应的方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

android 中的IPC binder 机制第一部分 Binder的组成1.1 驱动程序部分驱动程序的部分在以下的文件夹中:kernel/include/linux/binder.hkernel/drivers/Android/binder.cbinder驱动程序是一个miscdevice,主设备号为10,此设备号使用动态获得(MISC_DYNAMIC_MINOR),其设备的节点为:/dev/binderbinder驱动程序会在proc文件系统中建立自己的信息,其文件夹为/proc/binde,其中包含如下内容:proc目录:调用Binder各个进程的内容state文件:使用函数binder_read_proc_statestats文件:使用函数binder_read_proc_statstransactions文件:使用函数binder_read_proc_transactionstransaction_log文件:使用函数binder_read_proc_transaction_log,其参数为binder_transaction_log (类型为struct binder_transaction_log) failed_transaction_log文件:使用函数binder_read_proc_transaction_log 其参数为binder_transaction_log_failed (类型为structbinder_transaction_log)在binder文件被打开后,其私有数据(private_data)的类型:struct binder_proc在这个数据结构中,主要包含了当前进程、进程ID、内存映射信息、Binder 的统计信息和线程信息等。

在用户空间对Binder驱动程序进行控制主要使用的接口是mmap、poll和ioctl,ioctl主要使用的ID为:#define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read)#define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, int64_t)#define BINDER_SET_MAX_THREADS _IOW('b', 5, size_t)#define BINDER_SET_IDLE_PRIORITY _IOW('b', 6, int)#define BINDER_SET_CONTEXT_MGR _IOW('b', 7, int)#define BINDER_THREAD_EXIT _IOW('b', 8, int)#define BINDER_VERSION _IOWR('b', 9, struct binder_version)BR_XXX等宏为BinderDriverReturnProtocol,表示Binder驱动返回协议。

BC_XXX等宏为BinderDriverCommandProtocol,表示Binder驱动命令协议。

binder_thread是Binder驱动程序中使用的另外一个重要的数据结构,数据结构的定义如下所示:struct binder_thread {struct binder_proc *proc;struct rb_node rb_node;int pid;int looper;struct binder_transaction *transaction_stack;struct list_head todo;uint32_t return_error;uint32_t return_error2;wait_queue_head_t wait;struct binder_stats stats;};binder_thread 的各个成员信息是从rb_node中得出。

BINDER_WRITE_READ是最重要的ioctl,它使用一个数据结构binder_write_read定义读写的数据。

struct binder_write_read {signed long write_size;signed long write_consumed;unsigned long write_buffer;signed long read_size;signed long read_consumed;unsigned long read_buffer;};1.2 servicemanager部分 servicemanager是一个守护进程,用于这个进程的和/dev/binder通讯,从而达到管理系统中各个服务的作用。

可执行程序的路径:/system/bin/servicemanager开源版本文件的路径:frameworks/base/cmds/servicemanager/binder.hframeworks/base/cmds/servicemanager/binder.cframeworks/base/cmds/servicemanager/service_manager.c程序执行的流程:open():打开binder驱动mmap():映射一个128*1024字节的内存ioctl(BINDER_SET_CONTEXT_MGR):设置上下文为mgr进入主循环binder_loop()ioctl(BINDER_WRITE_READ),读取binder_parse()进入binder处理过程循环处理binder_parse()的处理,调用返回值:当处理BR_TRANSACTION的时候,调用svcmgr_handler()处理增加服务、检查服务等工作。

各种服务存放在一个链表(svclist)中。

其中调用binder_等开头的函数,又会调用ioctl的各种命令。

处理BR_REPLY的时候,填充binder_io类型的数据结果1.3 binder的库的部分binder相关的文件作为Android的uitls库的一部分,这个库编译后的名称为libutils.so,是Android系统中的一个公共库。

主要文件的路径如下所示:frameworks/base/include/utils/*frameworks/base/libs/utils/*主要的类为:RefBase.h :引用计数,定义类RefBase。

Parcel.h :为在IPC中传输的数据定义容器,定义类ParcelIBinder.h:Binder对象的抽象接口,定义类IBinderBinder.h:Binder对象的基本功能,定义类Binder和BpRefBaseBpBinder.h:BpBinder的功能,定义类BpBinderIInterface.h:为抽象经过Binder的接口定义通用类,定义类IInterface,类模板BnInterface,类模板BpInterfaceProcessState.h表示进程状态的类,定义类ProcessStateIPCThreadState.h表示IPC线程的状态,定义类IPCThreadState各个类之间的关系如下所示:在IInterface.h中定义的BnInterface和BpInterface是两个重要的模版,这是为各种程序中使用的。

BnInterface模版的定义如下所示:templateclass BnInterface : public INTERFACE, public BBinder{public:virtual sp queryLocalInterface(const String16& _descriptor);virtual String16 getInterfaceDescriptor() const;protected:virtual IBinder* onAsBinder();};BnInterface模版的定义如下所示:templateclass BpInterface : public INTERFACE, public BpRefBase{public:BpInterface(const sp& remote);protected:virtual IBinder* onAsBinder();};这两个模版在使用的时候,起到得作用实际上都是双继承:使用者定义一个接口INTERFACE,然后使用BnInterface和BpInterface两个模版结合自己的接口,构建自己的BnXXX和BpXXX两个类。

DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个宏用于帮助BpXXX类的实现:#define DECLARE_META_INTERFACE(INTERFACE)static const String16 descriptor;static sp asInterface(const sp& obj);virtual String16 getInterfaceDescriptor() const;#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)const String16 I##INTERFACE::descriptor(NAME);String16 I##INTERFACE::getInterfaceDescriptor() const {return I##INTERFACE::descriptor;}sp I##INTERFACE::asInterface(const sp& obj){sp intr;if (obj != NULL) {intr = static_cast(obj->queryLocalInterface(I##INTERFACE::descriptor).get());if (intr == NULL) {intr = new Bp##INTERFACE(obj);}}return intr;}在定义自己的类的时候,只需要使用DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个接口,并结合类的名称,就可以实现BpInterface 中的asInterface()和getInterfaceDescriptor()两个函数。

第二部分 Binder的运作2.1 Binder的工作机制Service Manager是一个守护进程,它负责启动各个进程之间的服务,对于相关的两个需要通讯的进程,它们通过调用libutil.so库实现通讯,而真正通讯的机制,是内核空间中的一块共享内存。

相关文档
最新文档