Binder通信原理与弊端解析
创始人
2024-05-31 11:05:42
0

Binder 定义

简单来说,Binder 就是用来Client 端和 Server 端通信的。并且 Client 端和 Server 端 可以在一个进程也可以不在同一个进程,Client 可以向 Server 端发起远程调用,也可以向Server传输数据(当作函数参数来传),并且不用关心对方在哪个进程。

Binder的基本原理

Binder借助了内存映射(mmap)的方法,在内核空间和接收方用户空间的数据缓存区之间做了一层内存映射。从发送方用户空间拷贝到内核空间缓存区的数据,就相当于直接拷贝到了接收方用户空间的数据缓存区,从而减少了一次数据拷贝。

设计夸进程通信所关注的点有哪些

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4uNyS1N-1678366714274)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/44939d589c264326bc5ac43d543b8279~tplv-k3u1fbpfcp-zoom-1.image)]

如果使用 Linux 提供的夸进程通信方式来看,流程如上图,Client 端通过函数传参序列化成 buffer,然后通过 Linux提供的如 Socket ,管道,等通信方式进行传输,然后到 Server端进行解析。

像早期的电话总机接线员,我们想打个电话,先打到总机告诉接线员我要打到哪里,接线员再把电话转接过去,这样的方式即麻烦,采用人工的方式,效率慢,还需要先接收再转接,还不安全。理想的跨进城通信方式要保证 性能好、使用方便、安全 等需求,binder 和其他方式对比就满足了这些要求。

Binder 的意义

  • Binder 并不是 Linux 提供的跨进程机制,它是跑在驱动层的跨进程方式,它是数据内核太,并没有使用 Linux 的跨进程通信方式(socket,pipe,共享内存…)
  • 性能:Linux 提供的socket、pipe 是需要内核来做中转,相当于两次数据拷贝,一次是从应用层拷贝到内核,一次是从内核拷贝到应用层。Binder 是有开辟一块物理内存,同时影射到内存和用户空间,所以当你把数据拷贝到内核空间时也就相当于拷贝到了应用空间了。
  • 方便易用:逻辑简单直接,不容易出问题,共享内存虽然性能很好,但是用起来比较复杂,没有 binder 好用。
  • 安全:普通的 Linux 的跨进程通信方式并不是很安全,比如 socket 它的 ip 地址都是开放的,只要知道 ip 就可以去连接访问了。主要我们拿不到调用方可靠的信息,可靠的信息只能在IPC内核态的时候添加好,不能让调用方自己添加。

binder 的通信架构

上图是展示的系统服务的 binder 通信,因为只有系统服务才能注册到 ServiceManager 中,应用的服务是无法注册到 ServiceManager 中的,通过不了权限验证。Client 是应用进程,Server 是系统服务(可能跑在 SystemServer 进程,也可能是单独进程)ServiceManager是一个单独的进程。无论是 Client 还是 Server 还是 ServiceManager,第一步都是需要先启动 binder 机制。

binder 通信

从ServiceManager开始,通过一系列的启动和准备,最后会进入 loop 循环等待Client 和 server 端的消息。具体逻辑可以查看ServiceManager 的作用、启动流程和工作原理。

上图 Server 端一般是系统服务,Client 一般是应用服务,所以一般显示 Server 先和 ServiceManager 交互,系统服务是如何注册到 ServiceManager 中的可以查看 怎样添加一个Android的系统服务?。

binder 驱动的分层架构图

binder 通信弊端

传统Linux IPC机制的缺点

性能角度

管道、消息队列、Socket实现一次进程通信都需要2次内存拷贝,效率太低;

共享内存虽然不需要拷贝内存,但管理复杂;

Binder只需要一次内存拷贝,从性能角度来看,低于共享内存方式,优于其它方式。

IPC数据拷贝次数
share mm0
Binder1
pipe MQ SOCKET2

安全性考虑

a. 传统的IPC机制没有安全措施,接收方无法获得对方可靠的进程ID或用户ID,比如Socket通信的IP地址是客户端填入的,很可能被恶意程序篡改。

b. Android作为面向终端用户的开源平台,因此安全性极为重要。Android系统为每个已安装的App都分配了用户ID(UID),UID是鉴别进程身份的重要标识,通过UID可以进行一系列的权限校验。

c. 传统IPC的接入点是开放的,任何程序都可以根据协议进行访问,无法阻止恶意程序的访问。

综上所述:

Android需要一种基于C/S架构的IPC机制,Server端需要能够对Client的请求进行身份校验,来保证数据的安全性。

Binder驱动是一种虚拟的字符设备,注册在/dev/binder中,其定义了一套Binder通信协议,负责建立进程间的Binder通信,提供了数据包在进程之间传递的一系列底层支持。应用进程访问Binder驱动也是通过系统调用实现。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...