为什么 Android 要采用 Binder 作为 IPC 机制?

news2024/11/17 1:33:07

前言

Android 系统为了安全、稳定性、内存管理等原因,Android 应用和系统服务都是运行在独立的进程中的,但系统服务与应用进程之间,应用进程A与应用进程B之间需要通信和数据共享的。因此,Android 系统需要提供一套能够高效、安全的跨进程通信方案。于是 Binder 就应运而生。
Binder 是 Android 中最重要的一种进程间通信机制,基于开源的 OpenBinder。George Hoffman 当时任 Be 公司的工程师,他启动了一个名为 OpenBinder 的项目,在 Be 公司被 ParmSource 公司收购后,OpenBinder 由 Dinnie Hackborn 继续开发,后来成为管理 ParmOS6 Cobalt OS 的进程的基础。在 Hackborn 加入谷歌后,他在 OpenBinder 的基础上开发出了 Android Binder(以下简称 Binder),用来完成 Android 的进程通信。

1 为什么需要学习 Binder

作为一名 Android 开发者,我们每天都在和 Binder 打交道,虽然可能有的时候不会注意到,譬如:

  • startActivity 的时候,会获取 AMS 服务,调用 AMS 服务的 startActivity 方法
  • startActivity 传递的对象为什么需要序列化
  • bindService 为什么回调的是一个 IBinder 对象
  • 多进程应用,各个进程之间如何通信
  • AIDL 的使用
    它们都和 Binder 有着密切关系,当碰到上面的场景,或者一些疑难问题的时候,理解 Binder 机制是非常有必要的。

2 为什么 Android 选择 Binder

这就要从进程间通信开始说起了,我们先看看比较常见的几种进程间通信方式。

2.1 常见进程间通信

2.1.1 共享内存

共享内存是进程间通信中最简单的方式之一,共享内存允许两个或更多进程访问同一块内存,当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改,它的原理如下图所示:
共享内存原理
因为共享内存是访问同一块内存,所以数据不需要进行任何复制,是 IPC 几种方式中最快,性能最好的方式。但相对应的,共享内存未提供同步机制,需要我们手动控制内存间的互斥操作,较容易发生问题。同时共享内存由于能任意的访问和修改内存中的数据,如果有恶意程序去针对某个程序设计代码,很可能导致隐私泄漏或者程序崩溃,所以安全性较差。

2.1.2 管道

管道分为命名管道和无名管道,它是以一种特殊的文件作为中间介质,我们称为管道文件,它具有固定的读端和写端,写进程通过写段向管道文件里写入数据,读进程通过读段从读进程中读出数据,构成一条数据传递的流水线,它的原理如下图所示:
管道原理
管道一次通信需要经历2次数据复制(进程A -> 管道文件,管道文件 -> 进程B)。管道的读写分阻塞和非阻塞,管道创建会分配一个缓冲区,而这个缓冲区是有限的,如果传输的数据大小超过缓冲区上限,或者在阻塞模式下没有安排好数据的读写,会出现阻塞的情况。管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式。

2.1.3 消息队列

消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。消息队列允许多个进程同时读写消息,发送方与接收方要约定好,消息体的数据类型与大小。消息队列克服了信号承载信息量少、管道只能承载无格式字节流等缺点,消息队列一次通信同样需要经历2次数据复制(进程A -> 消息队列,消息队列 -> 进程B),它的原理如下图所示:
消息队列原理

2.1.4 Socket

Socket 原本是为了网络设计的,但也可以通过本地回环地址 (127.0.0.1) 进行进程间通信,后来在 Socket 的框架上更是发展出一种 IPC 机制,名叫 UNIX Domain Socket。Socket 是一种典型的 C/S 架构,一个 Socket 会拥有两个缓冲区,一读一写,由于发送/接收消息需要将一个 Socket 缓冲区中的内容拷贝至另一个 Socket 缓冲区,所以 Socket 一次通信也是需要经历2次数据复制,它的原理如下图所示:
socket原理

2.2 Binder

了解了常见进程间通信的方式,我们再来看一下 Binder 的原理。
Binder 是基于内存映射 mmap 设计实现的,我们需要先了解一下 mmap 的概念。

2.2.1 mmap

mmap 是一种内存映射的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read、write 等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
Linux 内核不会主动将 mmap 修改后的内容同步到磁盘文件中,有4个时机会触发 mmap 映射同步到磁盘:

  • 调用 msync 函数主动进行数据同步(主动)
  • 调用 munmap 函数对文件进行解除映射关系时(主动)
  • 进程退出时(被动)
  • 系统关机时(被动)

通过这种方式,直接操作映射的这一部分内存,可以避免一些数据复制,从而获得更好的性能。

2.2.2 原理

一次 Binder IPC 通信的过程分为以下几个步骤:

  1. 首先,Binder 驱动在内核空间中开辟出一个数据接收缓冲区
  2. 接着,在内核空间中开辟出一个内核缓冲区
  3. 将内核缓冲区与数据接收缓冲区建立映射关系
  4. 将数据接收缓冲区与接收进程的用户空间地址建立映射关系
  5. 发送方进程通过 copy_from_user 将数据从用户空间复制到内核缓冲区
  6. 由于内核缓冲区与数据接收缓冲区有映射关系,同时数据接收缓冲区与接收进程的用户空间地址有映射关系,所以在接收进程中可以直接获取到这段数据

这样便完成了一次 Binder IPC 通信,它的原理如下图所示:
binder原理
可以看到,通过 mmap,Binder 通信时,只需要经历一次数据复制,性能要优于管道、消息队列、socket等方式,在安全性,易用性方面又优于共享内存。鉴于上述原因,Android 选择了这种折中的 IPC 方式,来满足系统对稳定性、传输性能和安全性方面的要求。

3 Binder 架构

Binder 在 Android 系统中江湖地位非常之高。在 Zygote 孵化出 system_server 进程后,在 system_server 进程中出初始化支持整个 Android framework 的各种各样的 Service,而这些 Service 从大的方向来划分,分为 Java 层 Framework 和 Native Framework 层(C++)的 Service,几乎都是基于 BInder IPC 机制。
Binder 也是一种 C/S 架构,分为 BpBinder(客户端)和 BBinder(服务端),他们都派生自 IBinder。其中 BpBinder 中的p表示 proxy,即代理。BpBinder 通过 transact 来发送事务请求,BBinder 通过 onTransact 来接收相应的事务。
binder的C/S架构
Binder 一次通信的时序图如下:
binder通信时序
Binder 采用分层架构设计:
binder分层架构设计

4 总结

总之,一句话“无 Binder 不 Android”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js 踩了正则表达式的大坑!lastIndex属性

参考文章 踩坑情景 今天一来,被测试测出了一个问题,在使用vantUI的移动端项目中,我虽然对用户输入的值做了去除首尾空格的操作,但却忘记对用户输入的空值进行错误提示,fine,我选择给表单添加rules规则&am…

[附源码]JAVA毕业设计远程教学系统录屏(系统+LW)

[附源码]JAVA毕业设计远程教学系统录屏(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

40个高质量SSM毕设项目分享【源码+论文】

文章目录前言 题目1 : 基于SSM的房屋出租出售系统 <br /> 题目2 : 基于SSM的房屋租赁系统 <br /> 题目3 : 基于SSM的个人健康信息管理系统 <br /> 题目4 : 基于SSM的共享充电宝管理系统 <br /> 题目5 : 基于SSM的即动运动网站 <br />前言 &…

【C语言数据结构(基础篇)】第二站:顺序表

目录 一、线性表 二、顺序表的实现&#xff08;概念以及静态顺序表&#xff09; 1.创建三个工程文件 2.顺序表的概念 3.顺序表的定义 4.初始化顺序表 5.静态顺序表的尾插 三、顺序表的实现&#xff08;升级为动态顺序表&#xff09; 1.动态顺序表的定义 2.动态顺序表的…

艾美捷NCTC-135培养基化学性质和基本配方

艾美捷NCTC-135培养基背景&#xff1a; NCTC培养基&#xff0c;由马里兰州贝塞斯达国家癌症研究所&#xff08;NCI&#xff09;生物实验室组织培养科开发&#xff0c;用于建立和维持L929小鼠细胞株。 艾美捷NCTC-135培养基化学性质&#xff1a; 外观&#xff1a;白色至浅粉色…

[附源码]Python计算机毕业设计Django超市商品管理

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Android -- 每日一问:谈谈MVC、MVP和MVVM模式,你有在自己的项目中使用过吗?

经典回答 MVC 模式 全名是Model–View–Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;在改进和个性化定制界面及用…

[附源码]Python计算机毕业设计SSM基于的高速收费系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

防火墙双机热备配置实验

目录 一、实验拓扑 二、配置云 三、配置防火墙 四、分配FW的接口地址与安全区域 五、按图示进行配置 六、双机热备的配置 七、配置NAT 八、模拟双机热备的切换 一、实验拓扑 看上去挺复杂的其实这个实验还是比较简单的&#xff0c;Client1配置为IP 10.3.0.10 网关10.3.…

python教程十二 字典

字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value2, key3 : value3…

学会模态计算,你就掌握了结构振动冲击计算的核心

模态计算对于认识结构振动特性至关重要&#xff0c;通过模态计算可以得到模态的固有频率&#xff0c;振型&#xff0c;参与系数和有效质量等参数&#xff0c;模态计算的这些参数我们应该很熟悉&#xff0c;但是如果正确合理的使用这些结果指导工程计算&#xff0c;是我们今天讨…

[附源码]Python计算机毕业设计滁州市围棋协会Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

12月12日: 学习跟着猫叔写代码

视频地址&#xff1a;fastadmin系列教程:小白学习之路 学前准备 安装过程 数据库分析 关联查询搜索 数据校验 视图渲染 api登录注册 token验证 table表格_哔哩哔哩_bilibili 前两节是安装fastadmin操作&#xff08;可参考我自己的文章&#xff09; 11月30日&#xff1a;linux服…

当要测试的对象依赖另一个无法控制的对象(系统相关、第三方服务等),这个时候我们应该如何测试?

一.问题描述 判断文件是否有效的需求变更了&#xff1a;有效的文件扩展名存储在文件系统中&#xff0c;要测试的FileVerify类就依赖FileExtensionManager类&#xff0c;在这种场景下如何测试FileVerify类的逻辑呢? 1 public class FileVerify2 { 3 …

精品基于SSM的社区疫情防控平台

《基于SSM的社区疫情防控平台》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&…

(附源码)springboot螺丝加工厂订单管理 毕业设计 010346

题 目 springboot螺丝加工厂订单管理 目 录 摘要 1 1 绪论 1 1.1项目开发的背景 1 1.2项目开发的意义 1 1.3系统开发技术的特色 1 1.4论文结构与章节安排 1 2 螺丝加工厂订单管理 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1数据流程 3 2.3.2业务流程 4 2.3 系统…

C++11标准模板(STL)- 算法(std::sort_heap)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 数据结构的堆物理结构是数…

百度地图(HTML5新特性)-全面详解(学习总结---从入门到深化)

目录 百度地图_账号和获取密钥 百度地图_初始化 百度地图_变更地图类型 百度地图_添加控件 百度地图_改变控件位置 百度地图_添加覆盖物 百度地图_自定义标注图标 百度地图_添加文本标注 百度地图_正/逆地址解析 百度地图_信息窗口 百度地图_规划驾车路线 百度地图_…

亚马逊、速卖通、阿里国际自动和手动广告的核心是什么?自己养买家号测评的好处

亚马逊等跨境电商平台在打造的新品期&#xff0c;因为选择的细分类目是非常精准刚需的&#xff0c;词少&#xff0c;所以一开始只开启了自动广告&#xff0c;自动广告跑起来&#xff0c;转化很好。 自动广告跑了一段时间之后&#xff0c;把自动广告里表现比较好的出单词都挑出…

冰雪旅游热开启!IU酒店与您畅游山水之间

连日来&#xff0c;全国多地不断调整疫情防控措施&#xff0c;提高科学精准防控能力。国家防疫“新十条”出台后&#xff0c;大众旅游热情明显增高。 据穷游网站内数据显示&#xff0c;去海南、云南等地避寒&#xff0c;或前往东北、新疆等地滑雪备受用户推崇。三亚、上海、成…