Binder(一):概述

2024-09-06 11:44
文章标签 概述 binder

本文主要是介绍Binder(一):概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Binder开篇:

1. 开场:

Binder这个模块知识点很多,也很杂,从应用层,到native,还要深入驱动,这块涉及了java、c++、c,面很广,我也一直没敢写相关的博客,因为我也才接触Android不久,想写一篇关于Binder的博客,又害怕自己能力不够,误导了初学者。其实我是不建议初学者上来就看Binder的,毕竟基础没打好,看了也是很难理解,不过每个人的学习方式不同,也不是每个人的学习方式都和我一样。 我就是多次去看相关的博客去尝试理解Binder,但是怎么说呢,总是学了一点点就遇到难点无从下手了。最终还是关闭代码界面放弃了入门。当然这里也强烈推荐一个大佬的博客,写得十分详细,看起来也不至于很费力:Binder系列—开篇 - Gityuan博客 | 袁辉辉的技术博客

2. Binder是什么:

Binder是一种应用于进程间通信的技术。他的功能就相当于一个外卖员,而Server端就相当于是外卖商家,你就是Client端。这个时候外卖平台呢,就是一个中间商,你只需要在外卖APP上搜索想要吃什么,就能看到好多个商家,这就像Client侧想要选择通信的对象一样,Client选择通信的进程,会根据所需要的服务(Service),在ServiceManager中去搜索对应的Server端,就像你在选要点哪一家店时一样。
于是,这里就将一个抽象的概念对应到了一个实际的环境:点外卖的你->Client端;商家->Server端;外卖APP->ServiceManager;你在外面APP上订的餐和商家送过来的实物->通信的数据;外卖员->Binder驱动;

在这里插入图片描述

正如上图表述的内容,进程A就是Client,进程B就是Server,步骤3,4就是Client和Server的通信内容。可以把3,4这个流程叫做一次Binder通信的过程。不过看了这个简易的流程,就会有一个疑问,进程A为什么就跟进程B通信,不能是进程C、D呢?
这是因为进程A需要的服务a刚好只有进程B有,所以进程A只能和进程B通信。那问题又来了,进程A只知道自己要用服务a,但是为什么就知道服务a在进程B呢?
这个问题,刚好就引出了另外两个Binder通信,不过这两次通信比较容易让我们搞混,我在初学的时候,就被这多个Binder搞得晕头转向,一会这里一个Binder一会哪里一个Binder,最后哪个Binder对应哪个Binder是一团浆糊。这里就把这块用图的形式展现出来,如图三个蓝框,框出来的就分别为三次Binder通信过程。其按照时间先后关系,应该分别是:(1)进程B向ServiceManager注册自己公开的服务a;(2)进程A向ServiceManager查询,提供服务A的进程信息;(3)进程A使用进程B的服务a。
首先,在情况(1)中,进程B需要向ServiceManager注册自己公开的服务a,这个过程中,进程B反倒成了Client端了,而Server端则是ServiceManager,因为此时是B想要使用ServiceManager的平台,展示他的服务a,就像外卖商家,需要在外卖平台上注册,才能通过外卖平台向消费者们展示自己的商品一样。 在情况(2)中,ServiceManager依旧是Server端,因为这时候是进程A向他发起的请求,进程A需要通过ServiceManager查找谁能够给自己提供服务a,就像消费者在外卖平台上搜索需要的物品一样。 而情况(3)就是最容易理解的一次Binder通信了。当消费者在外卖平台上购买了商品后,这时候就到了消费者和商家直接接触的过程了,就不需要外卖平台了,消费者付钱给商家,商家送货过来。

3. Binder的原理:

那为啥进程间通信要用Binder呢?还记得之前背八股文的时候,进程间通信好多方法呢,这时候咋只用Binder了?
这个绝大部分要归功于Binder的效率了。大家都知道进程与进程之间,存储空间是相互隔离的,这就是为了防止进程A在运行过程中篡改了进程B的内容,导致进程B的异常,这个也很好理解,进程A和进程B都是由init进程fork而来,所以他们之间就是亲兄弟了,但是亲兄弟也得明算账啊,你会和你的亲兄弟共用一张银行卡吗?
所以亲兄弟也得分家,这个分家就分出来的就是用户空间,进程A和进程B都是有自己独立的家庭,但是他们说到底还是亲兄弟,所以还有一个共同的家庭,就是内核空间。所以呢过年过节的还是要回家,这时候大家都处于内核空间,交流起来就更方便了,也能面对面的传递一些物品了。
在这里插入图片描述

而对于进程来说,这不就是进程B想发个消息给进程A,得先在进程B中,把信息从用户空间拷贝到内核空间,然后进程A再将进程B放进去的信息拷贝到自己的用户空间嘛。这样就调用了一次copy_from_usr和一次copy_to_usr,虽然不知道这两函数有多耗时,但是两次拷贝操作至少不会省时间对吧。
而Binder机制就有一个好处,就是能只拷贝一次,那Binder是怎么做到的呢?
在这里插入图片描述

如上图,Binder在实现进程间通信的时候,做了一个小小的优化,他将内核空间的一块区域,映射到了进程A的用户空间,这样当进程B将信息从自己的用户空间拷贝到内核空间之后,就相当直接拷贝到进程A的用户空间,当然这时候肯定有小伙伴要问了,那为啥不直接从进程B的用户空间映射到进程A呢? 这个我也想过,不过又想起来,那不是为了进程安全,把他们隔离了嘛。只能通过内核空间向用户空间映射,所以这copy_from_usr的拷贝操作还是省不掉的。这里涉及的内存映射、虚拟地址、内核空间和用户空间的内容,都是一些基础知识,如果不了解还是得去看看的,所以说不太建议初学者上来就硬刚Binder,这些概念虽然不难,但是放在一起还是足够让大家从入门的放弃的。
当然啦,放着那么多的进程间通信方式不用,只用Binder,肯定不止这一个好处,第二个好处就是安全性。传统的IPC机制,是不考虑安全措施的,接收端是无法得到对方的身份信息的,也就是说,很可能Server侧会遭遇“电信诈骗”!而Binder机制,则是给每个进程分配一个UID,也就是电话号码实名制,没有实名制不能激活电话卡(虽然这个实名制好像只能让诈骗犯知道我们的身份呜呜呜,但是在binder通信中,这个实名制比我们的实名电话卡还是不知道高哪去了)。还有一个是我在网上查到的:传统IPC的接入点是开放的,任何程序都可以根据协议进行访问,无法阻止恶意程序的访问。这句话我也不太理解,暂时先记在这吧。

4. Binder的分层架构:

Binder的跨度很大,要想理解Binder,首先得会C++和C(Java就不说了,Java都不会还怎么看Android),这幅图就是发起一次Binder通信需要涉及的一些类和流程,我接下来就是按照这个图,分模块来讲解Binder通信的原理,心里也是比较忐忑,希望开了这个坑,能顺利的填上。
其实现在的Binder封装的都比较完善,我们在系统侧都是直接通过一个封装好的类去调用就行,基本都是封装成了Aidl接口,一般就是Server侧实现一下Aidl的stub类的方法,然后Client侧调用代理类,代理类虽然和Server侧的类的方法啥的名字都一样,但是代理侧肯定是不能真的实现函数的,代理类的主要功能就是将参数啥的统统打包,然后发送给Server侧,等Server侧调用对应的方法,再将处理完的数据返回就好了。

在这里插入图片描述

接下来的几个篇章将是代码的解读了,这里只是做了一个简单的概述,将一些概念通过比喻的形式展现出来,更方便理解,代码阶段一般不会有啥比喻了,就得硬看了。

这篇关于Binder(一):概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141910

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE)似乎是最佳选择,因为它功耗低,在我们的手机中无处不在,而且无需连接到更广泛的网络。因此,蓝牙应用程序的需求也在不断增长。 通过阅读本文,您将了解如何开始在 Flutter 中开

类和对象的概述以及this指针的应用

定义 类是一种用户自定义的复合数据类型,即包括表达属性的成员变量,也包括表达行为的成员函数                                                                                                                                         类可用于表达那些不能直接与内置基