概念
Binder 是Android操作系统中用于进程间通信的一种机制
为什么使用Binder
相较于Linux提供的IPC机制,
- Binder性能优势,仅需要一次拷贝,性能好于除
共享内存
外的IPC方式 - 稳定性,C/S架构,架构清晰,调用双方职责明确
- 安全性,Binder和Android深度绑定,可以做到更细粒度的权限控制,比如服务调用方权限检查,限制未声明权限的客户端访问敏感信息,UID和PID校验系统服务的访问权限等。
使用场景
Binder作为一种进程间通信(IPC)机制,具体场景为服务的实现和服务的调用为不同进程,原因是多方面的,我们可以从系统角度和应用角度来看。
- 系统服务的获取,比如位置信息的获取,需要使用位置服务,通过Binder实现
- Service和Activity通信,推送服务,后台音乐播放,需要UI主进程和后台进程独立
- 跨应用程序通信,例如天气通讯录应用允许其他程序访问应用产生的数据或写入数据
重要的概念
- Binder驱动: 负责管理Binder服务和客户端之间通信,位于Linux内核中
- 数据格式:基础数据结构和实现了Parcelable的复杂数据结构
- 代理(Proxy)代理客户端将方法调用转发到服务端
- 存根(Stub)负责接收调用并执行相应的操作
个人理解
Binder机制是 Linux 共享内存的优化,受限于移动设备的特点,例如,设备性能较差,系统服务和跨进程调用频次更高。且对安全性要求细粒度可控,硬件资源紧张等特点。将自由分配
的模式,改为集中管理
类比现实来看, 我们可以将Android系统想象成一个小区
,每个App想象成业主
, Binder驱动 想象成居委会
,业主(App)是运行在沙盒当中无法出去,这是就需要业务员
代理。
居委会有一份服务电话表
和一些备忘录
。
- 业主怎么知道居委会的存在呢?分配的房间有
房间号
19-1-1403和居委会固定电话
001 - 居委会怎么知道服务的存在,供暖公司
入驻时
提供了电话,业主入住时
也声明了服务电话
现在模拟一个场景,业主S
是个唱歌主播, 业主C
想要点首《罗刹海市》
Binder流程
- C找到居委会电话,表达诉求,要求S唱首《罗刹海市》并附带五毛
演出费
- 居委会将歌名记在备忘录上,并打
视频电话
给S,并将备忘录投屏
给S - S根据投射来的歌名
开始找到伴奏并演唱
Linux共享内存
- S创建
点歌台
,接受有偿点歌 - C
没有钱
但点了一首《学猫叫》 - S唱了一半,C1清空了点歌台,导致S停止演唱
这是一个非常简化,甚至不太契合的场景,只有一次交互,甚至没有返回值,但有助于我们理解Binder的优势。
- 性能:拷贝一次,拷贝到
备忘录
- 稳定:C睡着,或S唱完
不影响彼此
- 安全性:可以
检查
C有没有钱,房间号
是否可以点歌
总结
Android Binder是一种和Android系统深度绑定的IPC机制,渗透在Android系统从硬件到软件的各个层面。最大程度的可控且适合移动端设备。