Linux 进程通信方法:socket 信号量 管道 共享内存 消息队列。
但是Android 选择了 binder 机制。
可能原因:Socket 开销大 且效率不高;管道和队列copy次数太多。传统的IPC通信机制安全性较低,无法得到发送进程方可信的PID/UID ,难以甄别身份。
Binder 保证了安全性和效率。
binder 机制 四大模块:
Client Server ServerManager BinderDriver
client & server 为用户实现部分。
BinderDriver 运行于内核空间,以字符设备中的misc类型注册。可以从/dev/binder/设备文件节点上,通过open和ioctl文件操作函数与binderDriver 通信。
其主要负责通信的建立,以及其在进程间的传递和binder 引用计数管理、数据包的传输等。
client 与server 之间的跨进程通信则统一通过binder driver 处理转发。
运行机制:
ServerManager 相当于DNS; 是一个引用号为0 的binder server。
clinet 先通过引用号0 ,向server Manager 去查询需要的binder的引用号。
binder server 会封装好数据后,向binder driver 查询,并返回数据,最终再返回给client;
参考:
Android 源码设计模式 P340