Binder机制

// 1. 一次 Binder 调用流程
Client Process → Binder Driver → Server Process
    ↓               ↓              ↓
Proxy          跨进程通信      Stub/Impl

// 2. 关键源码类
IBinder           // 通信接口
Parcel            // 数据容器
ServiceManager    // 服务管家
BpBinder/BnBinder // 代理/本地对象

高频问题

Binder 为什么高效?

// 内核驱动层:一次拷贝 + mmap内存映射
static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {
    switch (cmd) {
        case BINDER_WRITE_READ:
            // 通过 copy_from_user 从用户空间读取数据
            // 通过 mmap 建立内存映射,减少拷贝次数
            break;
    }
}

Binder 与 Socket/AIDL 的关系?

如何突破 Binder 传输限制?(1MB)

AIDL

  • AIDL 是 Binder 的接口描述语言

  • Socket 是通用 IPC,Binder 为 Android 优化

步骤:

  1. 定义AIDL接口

  2. 实现接口

  3. 在Service中返回实现类的实例

  4. 客户端绑定服务并调用远程方法

AIDL 基础使用

1. 创建 AIDL 文件

java

java

下载

复制

2. 定义 Parcelable 对象

3. 定义回调接口

服务端实现

1. Service 实现

2. AndroidManifest.xml 配置

客户端实现

1. 连接服务

java

java

下载

复制

高级特性

1. 权限验证

2. 异步调用(oneway)

3. 定向 Tag 详解

简化版 Messenger 替代方案

如果不需要复杂接口,可以使用 Messenger:

java

java

下载

复制

最佳实践总结

1. 项目结构

2. 编码规范

3. 调试技巧

Last updated