最简整理Binder Driver

Android的C/S体系里有三个角色:
     Server 0,负责服务的登记、检索等管理工作,也称Context Manager,节点编号(Handle)是0
     Server N,提供某种服务
     Client n,索取某种服务

从上往下看,Binder Driver是一个字符设备,提供字符流操作函数

在内部,为Android系统的C/S体系提供支撑,包括:
     为Client n、Server N生成节点
     访问Server 0,也即Context Manager服务器
     连接Client和Server节点以便进行通信,也即路由并连接

至于数据传输的细节,和一般的网络分层传输区别不大。

据说:若想进一步理解Binder,必须学习Service Manager与Service Framework。也许。扫一眼试试。

### 3. Binder通信的关键组件及实现步骤 Binder 机制是 Android 系统中实现进程间通信(IPC)的核心技术,其底层依赖于 Binder 驱动,通过内核空间的高效数据传输机制实现跨进程数据交换。Binder 通信的实现涉及多个关键组件,包括 Binder 实体(Binder Node)、Binder 引用(Binder Reference)以及 Service Manager 等。 Binder 实体是服务端进程创建的 Binder 对象,用于描述该服务在 Binder 驱动中的状态。每个服务组件(如 Service)在 Binder 驱动中都对应一个唯一的 Binder 实体。Binder 引用则是客户端用来访问 Binder 实体的代理对象,它在用户空间表现为 BpBinder,通过 Binder 驱动将请求转发给实际的 Binder 实体[^2]。 ### 3.1 Binder通信的核心组件分析 Binder 实体与引用的核心区别在于:Binder 实体代表服务端的实际对象,而 Binder 引用是客户端访问该对象的代理。Binder 实体在服务端通过 `onTransact` 方法处理客户端的请求,而 Binder 引用则通过 `transact` 方法向服务端发送 IPC 请求。 在 Android 系统中,Binder 通信通常通过 AIDL(Android Interface Definition Language)自动生成代码来实现。以下是一个单的 Binder 服务接口定义: ```aidl // IMyService.aidl package com.example; interface IMyService { int add(int a, int b); } ``` AIDL 编译器会生成对应的 Java 接口和 Binder 类,服务端需要实现该接口并注册到 Service Manager 中,客户端则通过 `ServiceManager.getService` 获取服务引用。 ### 3.2 Binder通信的实现步骤 1. **定义 AIDL 接口** 创建一个 AIDL 文件并定义通信接口,如上述的 `IMyService` 接口。 2. **实现服务端 Binder 类** 在服务端进程中创建一个继承自 `Binder` 的类,并实现 AIDL 接口中定义的方法。 ```java public class MyService extends Service { private final IMyService.Stub binder = new IMyService.Stub() { @Override public int add(int a, int b) { return a + b; } }; @Override public IBinder onBind(Intent intent) { return binder; } } ``` 3. **注册服务到 Service Manager** 在系统启动时或服务创建时,通过 `ServiceManager.addService` 将服务注册到 Service Manager 中,使其可供其他进程访问。 4. **客户端获取服务引用并调用方法** 客户端通过 `ServiceManager.getService` 获取服务的 Binder 引用,并将其转换为 AIDL 接口类型,进而调用远程方法。 ```java IMyService service = IMyService.Stub.asInterface(ServiceManager.getService("my_service")); int result = service.add(3, 5); ``` 5. **匿名 Binder 实现双向通信** 在某些场景下,客户端需要向服务端发送 Binder 对象以实现回调功能。此时可通过 `writeStrongBinder` 方法将客户端的 Binder 对象发送给服务端,服务端通过 `readStrongBinder` 获取该对象并保存为 BpBinder 实例,从而实现双向通信[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值