Binder是Android系统中实现进程间通信(IPC)的核心机制,也是Android系统的特色之一。
为什么Android选择Binder
| 通信方式 | 优点 | 缺点 |
|---|---|---|
| 管道 | 简单 | 单向通信,效率低 |
| Socket | 通用 | 开销大,速度慢 |
| 共享内存 | 速度快 | 同步复杂,安全性差 |
| Binder | 高效、安全、易用 | 学习曲线陡峭 |
Binder的核心优势
-
高效性
- 只需一次内存拷贝(传统IPC需要两次)
- 基于C/S架构,通信效率高
-
安全性
- 内核层验证进程身份(UID/PID)
- 支持建立私有通道
-
易用性
- 封装了复杂的底层实现
- 提供AIDL等高级接口
Binder的工作原理
1. 核心组件
- Binder驱动:位于内核空间,管理Binder通信
- ServiceManager:管理所有系统服务的注册和查询
- Client/Server:通信的双方
2. 内存映射机制
shell发送方进程 Binder驱动 接收方进程 | | | | 数据 | 内存映射(MMAP) | | -------------> | -----------------> | | 用户空间 | 内核空间 | 用户空间
- 发送方数据拷贝到内核空间
- 接收方通过内存映射直接访问,无需再次拷贝
3. 通信流程
shell1. Server注册服务 → ServiceManager 2. Client查询服务 → ServiceManager 3. Client获取Server的Binder代理 4. Client通过Binder代理调用Server方法 5. Binder驱动完成数据传递
Binder在Android中的应用
ActivityManagerService (AMS)
- 管理Activity生命周期
- 进程调度
WindowManagerService (WMS)
- 窗口管理
- 屏幕显示
PackageManagerService (PMS)
- 应用包管理
- 权限管理
AIDL(Android Interface Definition Language)
java// IRemoteService.aidl interface IRemoteService { int add(int a, int b); String getMessage(); }
AIDL编译后自动生成:
- Stub:服务端实现
- Proxy:客户端代理
面试要点
- Binder是Android特有的IPC机制
- 理解一次拷贝的内存映射原理
- 掌握AIDL的基本使用方法
- Binder线程池默认16个线程
- 注意Binder通信的数据大小限制(1MB左右)