Binder1
- 格式:pdf
- 大小:19.24 MB
- 文档页数:18


在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原理在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)事件,以便在客户端死亡时进行相应的处理。
[Binder深⼊学习⼀]Binder驱动——基础数据结构 具体代码路径: kernel/drivers/staging/android/binder.c kernel/drivers/staging/android/binder.h/** binder_work是⽤来描述待处理的⼯作项,这些⼯作项可能属于同⼀个进程,也可能属于⼀个进程中的某⼀个线程*/struct binder_work {struct list_head entry; // 将之以链表的形式嵌⼊到其他结构体中enum {BINDER_WORK_TRANSACTION = 1,BINDER_WORK_TRANSACTION_COMPLETE,BINDER_WORK_NODE,BINDER_WORK_DEAD_BINDER,BINDER_WORK_DEAD_BINDER_AND_CLEAR,BINDER_WORK_CLEAR_DEATH_NOTIFICATION,} type; // 描述⼯作类型};/** ⾸先我们需要明⽩Binder通信的过程就是Client和Service之间的通信,* 在⽤户空间的Service组件在内核空间使⽤Binder实体对象即binder_node来描述,* 在⽤户空间的Client组件在内核空间使⽤Binder实体对象的引⽤即binder_ref来描述,* Binder实体对象 ——> binder_node* Binder实体对象的引⽤ ——> binder_ref*/struct binder_node {int debug_id;struct binder_work work;union {struct rb_node rb_node;struct hlist_node dead_node;};struct binder_proc *proc;struct hlist_head refs;int internal_strong_refs;int local_weak_refs;int local_strong_refs;binder_uintptr_t ptr;binder_uintptr_t cookie;unsigned has_strong_ref:1;unsigned pending_strong_ref:1;unsigned has_weak_ref:1;unsigned pending_weak_ref:1;unsigned has_async_transaction:1;unsigned accept_fds:1;unsigned min_priority:8;struct list_head async_todo;};/** debug_id : 标志Binder实体对象的⾝份,帮助调试。