Binder机制详解(一)

Android——IPC机制(一)IPC概念以及Binder机制 由于IPC机制牵扯的东西比较多,所以这里将分为一个系列进行总结 主要介绍内如如下: IPC简介 Android中的多进程模式 开启多进程模式 多进程模式的运行机制 IPC基础概念介绍 Serializable接口 Parcelable接口 Binder Android中的IPC方式 使用Bundle 使用文件共享 使用Messenger 使用AIDL 使用ContentProvider 使用 阅读详情

系列目录

Binder机制详解(二)

Binder机制详解(三)


前言

Binder通信机制是android中不同于Linux的通信机制,那么为什么会有Binder通信机制,为什么不能用linux中已有的进程框架呢?Google工程师究竟是如何考量的?这一切需要从一场恋爱说起


一、爱情例子

1.普通Linux间进程通信方式

故事:男孩和女孩在某次旅游一见钟情,而旅行结束的他们不得不返回各自的工作城市,那个时代还没有微信,由于相隔在不同的城市。相思念的他们只能通过邮局抒发彼此爱慕之情

如果男孩想要给女孩发送信封,需要向本地邮局 寄信。再有全国邮局转发到 女孩所在的本地邮局

最后由女孩所在的本地邮局送到女孩手中

故事中在进程中的角色:

男孩** 称为进程A,工作城市A城,女孩称为进程B,工作城市B城

本地邮局称为用户空间, 全国邮局称为内核空间

本地邮局是他们彼此 离的最近的地方。他们能够在本地邮局直接接受和发送信封

这是普通linux进程通信的方式,那么问题来了:

男孩写好信之后,发送信件给本地邮局 , 相当于一次拷贝 我们把这个过程称为(copy_from_user)

女孩收到当地邮局通知,需要从本地邮局取信。相当于第二次拷贝,我们把这个过程称为(copy_to_user)

两次拷贝究竟性能怎么样,当然拷贝是非常耗性能的,而两次拷贝可以再优化优化。

那binder是怎么做到一次拷贝的呢

2.接着讲爱情的例子(Binder的实现机制)

后来在疫情结束后,这个女孩去了全国邮局依赖的快递公司上班去了,所有的邮件需要用快递公司来处理,刚好这家快递公司处理的是他们两个城市的信件。

这就给女孩创造了便利,不用去本地邮件取信件

但是男孩还是要发送信件。 binder拷贝也是发生在男孩这个地方copy_from_user,女孩由于在快递公司上班,可以随意浏览男孩的信件。不需要再取信件了。也就减少了从本地邮局取快递这次拷贝过程

思考: 大家还记不记的 接收端怎么写的,对! 接收端一定必须是服务Service,接收端不能是其他java对象。Service就是那个女孩。她必须在快递公司上班才能减少一次拷贝。所以这个Service,在通信前会注册在ServiceManager中。而男孩可以是任意对象,出现在任意地方

Linux 已有的进程通信,发送端和接收端可以是任意对象。出现在任意类中。但是必须牺牲多拷贝一次

Android的Binder通信,接受端不能是任意对象,只能是Service,这也节约了一次拷贝,牺牲了开发者的体验

3.Binder少拷贝一次的原理:

全国邮局 相当于内核空间的内存,所有的应用都与内核空间的内存发生频繁的调用,在Binder中传递数据本质上是通过文件读取来实现的

大家记不记得Linux系统 是文件操作系统,都是基于文件展开的。进程通信中 File也能实现进程通信

Binder机制中 在内存与文件中设计了一层映射关系。内核空间的内存是虚的的。文件IO是实的。 映射指的是内存与文件的映射,映射是通过mmap函数,

​ 而mmap函数 需要依赖一个文件,这个文件叫做“binder”。 对! 他没有后缀名,他就是一个文件。但是人们习惯性的把它称为binder驱动。

我们再来看看实际的是如何映射的

  • 全国邮局中的A城与B城的信件,相当于内核空间内存一部分虚拟内存区域。
  • A城与B城的快递公司,相当于文件实体。实际上邮件是由快递公司转发。邮局与快递公司的合作关系,可以理解内存与文件形成了映射关系(mmap)

4.服务端Service 也通过mmap函数监听文件的变化

一旦有信件到达女孩的公司直接读取出来,而不用去本地邮件取信件。

女孩怎么在公司取出来呢? 大家忘记了女孩在快递公司上班呢,快递公司会给员工分布工作内容

女孩的工作内容是查看快递接收站和快递发送站

这样你说能不能看到男朋友发过来的信件,还不用亲自跑到本地邮局,那不是爽歪歪

绿色部分 是女孩进程,绿色内有两个角色(女孩接触到的 接收站和收发站)

这一套机制的实现基于 aidl文件编译机制

在编译时生成了一个继承自Binder中的IInterface接口(女孩)。接口中有这样一个内部类叫Stub(女孩工作接触的接收站)和一个内部类叫Proxy(女孩工作接触的发送站)

男孩有邮件到了,女孩直接在 快递接收站查看男孩发过来的邮件(Stub中的 onTransact方法)

女孩思恋男孩,跟男孩发送邮件(Proxy中的transact方法)

Stub与Proxy中所有的方法是native直接调用过来的。参数是直接从内核空间传递过来的,不需要发生拷贝。

如果女孩需要给男孩发送消息,也不用跑到本地邮局,直接在 快递发送站,插入一个邮件就好了(调用Proxy的transct方法)

减少一次拷贝发生在 服务端service。直接有nativie层 的Binder调起。不需要再次拷贝

大家看完了 是不是对整个Binder机制有深刻的认识呢

从Binder的底层原理分析,让Android开发者真正了解到Binder的通信机制。从Linux进程通信技术认知到为什么Android会选择Binder作为通信方式,到Linux的进程原理,最后借鉴Binder中mmap函数打造优异的存储框架。

二、用户空间和内核空间

现代计算机都有两种以上的运行模式(普通模式、特权模式),

linux系统只有两层:

用户空间

  • 高优先级模式(特权模式)
  • 低优先级模式(普通模式)

linux系统在高优先级模式中运行系统内核代码以及与硬件密切相关的代码。低优先级运行应用程序与硬件无关部分。

​ 应用程序不能直接操控硬件或者调用内核函数,需借助一系列接口函数申请让系统调用相关代码在内核空间运行,获取代码运行权限。

1.好处

  • ​ 应用程序崩溃不会造成内核崩溃,拿windows举例来说,QQ崩溃掉不会造成程序死机。

  • ​ 每个应用程序或者进程都会有自己特定的地址、私有数据空间,程序之间一般不会相互影响

    ​ 例如QQ崩溃不会造成微信的崩溃。空间的隔离极大地提高了系统运行的稳定性。

2.计算机蓝屏带来的启示

计算机蓝屏主要是因为计算机硬件驱动不兼容问题造成,硬件驱动代码运行在内核空间,与kernel运行在相同空间内,所以驱动程序发生问题容易造成系统的崩溃。将用户空间与内核空间隔离开,可减少系统崩溃的可能,提高系统的稳定性。毕竟现实情况中,应用程序崩溃的情况比蓝屏出现的概率要多的多得多。在linux中这种情况可以类比。

​ window有上百个驱动,如蓝牙驱动,主板驱动,声卡驱动,麦克风驱动,显卡驱动,USB驱动等等!驱动过多容易造成蓝屏的出现。他们都运行在内核中。为什么会有这么多驱动。电脑中每一个配件都可以随意组合。形成一个完整的电脑

Android 发现

​ 在Android系统中,虽然也是基于Linux系统,但是这些驱动在Android厂商都已经消失了。全部集成化了、除了Binder驱动外,屏幕驱动,蓝牙驱动外几乎看不到其他驱动,这也是蓝屏比较少的原因

3.在linux中

每一个系统进程都拥有自己私有的地址空间和数据,用户空间造成的进程错误会被局部化,而不会影响到内核或者其他进程。(上面所说QQ和微信的例子)。

当用户进程需要完成在特权模式下才能完成的某些工作时,通过linux向上提供的系统调用接口进入特权模式,然后执行调用所提供的有限功能
​ 应用程序正常情况下都是运行在普通模式下,这部分代码运行的空间称为用户空间,当代码通过系统调用计入到特权级别运行的时候,对应的代码执行空间称为内核空间。

linux系统中每个进程占有4G空间(虚拟空间,并不一定真实占用)

空间分布如下:

  1. 用户空间: 0~(3G-1) 普通的应用程序代码运行在此部分空间中
  2. 内核空间: 3G~(4G-1) 内核代码段,其中驱动就是运行在此部分空间中

4.用户空间与内核空间交流

用户空间应用程序往往需要调用硬件(QQ调用相机拍照)或者运行与系统核心相关的内容(360清理进程),免不了与内核打交道,他们之间调用关系又是怎样呢?

交流关系以open()文件打开函数为例
上层应用在用户空间执行到 open() API函数时,会触发系统软中断,系统调用 系统调用函数 sys_open()系统调用函数,在内核空间执行open代码,这样用户空间的open函数内部代码就取得了在内核空间运行的权限,可以做一些比较牛比较核心的事情。
应用层API函数还有很多,大约有250个左右,涵盖范围包括文件操作、进程控制、网络操作等等。调用原理大致相同。

总结

Binder机制要完全搞懂,我会分几章来讲解,这章通过一个例子让我们认识了Binder通信机制不同于Linux的地方,还了解了用户空间和内核空间

理解 Android Binder 机制(一):驱动篇 转载: 理解 Android Binder 机制(一):驱动篇 目录Binder机制简介整体架构初识ServiceManager主要结构Binder协议 Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情。 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解。 这部分内容预计会分为三篇文章来讲解。本文是第一篇,首先会对整个Binder机制做一个架构性的讲解,然后会将大部分精力用来讲解Binder机制中最核心的部分:Binder驱动的实现。 Binder机制简介 Binde 阅读详情

相关推荐

避坑指南:PyCINRAD处理CINRAD雷达数据时遇到的5个典型报错及解决方案

本文针对使用PyCINRAD库处理CINRAD雷达基数据时常见的5个典型报错,提供了详细的解决方案。内容涵盖环境配置、数据读取、PPI可视化及性能优化等核心环节,重点解决了版本兼容性、数据异常处理和中文乱码等实际问题,帮助用户高效处理雷达基数据并生成准确的PPI图像。

cc789的博客 1068

Binder 跨进程传递对象的原理

1. binder 传递有哪些方式 2. binder 在传递过程中是怎样存储的 3. binder 对象序列化和反序列化的过程 4. binder 对象在传递过程中驱动做了什么

Lud的博客 1402

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

Habitat-v0.1.7安装全网最详细教程(解决habitat-sim下载时网络问题)

shannanshouyin的博客 1326

Binder的学习

AIDL基于Binder的封装 android IPC方式 <深入理解Android系统5.0>

sinat_35572837的博客 594

horizon之为connection服务器配置证书

打开connection1服务器(connection2 同connection1)再输入connection1的IP地址 可通过域名和IP地址进行登录。这时候用域名登录就发现证书已经没有警告了。win+R 调出“运行”,输入mmc。connection2 同上。如果还有报错请重启一下服务器。打开connection1。可以把这个先删掉 没用。打开DC_01服务器。右键选择证书颁发机构。友好名称只能是vdm。重启之后就没有报错了。

送个祝福给小豪的博客 2960

antdv-<a-form>的使用

是 Ant Design Vue 中用于创建表单的组件,提供了一种结构化的方式来收集用户输入。它支持多种布局、验证、数据绑定等功能,非常适合用于处理用户输入和提交数据。

2302_81312344的博客 2617

使用 Binder IPC

转载:https://source.android.com/devices/architecture/hidl/binder-ipc?hl=zh-cn 本页介绍了 Android O 中对 Binder 驱动程序进行的更改、提供了有关使用 Binder IPC 的详细信息,并列出了必需的 SELinux 政策。 对 Binder 驱动程序进行的更改 从 Android O 开始,

xixinliyan的专栏 2938

IMU预积分【SLAM】

预积分的推导过程比较多,所以这里只记录关键结论。 其实这些公式不太好记忆,因为预积分推导过程的想法来源很巧妙,无法看出物理意义。一切推导的来源: 最好记忆的旋转相对运动量: △Rij≐RiTRj=∏k=ij−1Exp((ω~k−bg,k−ηgd,k)△t)\triangle R_{ij} \doteq R_{i}^{T}R_{j} = \prod_{k=i}^{j-1}Exp((\tilde{\omega}_{k}-b_{g,k}-\eta_{gd,k})\triangle t) △Rij​≐RiT​Rj​

Tong_1024_的博客 1369

Android Binder调用的优先级

在Android系统中,Binder是进程间通信(IPC)的核心机制。Binder调用涉及优先级继承(Priority Inheritance),这是一种解决优先级反转问题的机制。优先级反转是指高优先级任务因为等待低优先级任务持有的资源而被阻塞,而低优先级任务又因为中等优先级任务的抢占而无法释放资源,从而导致高优先级任务长时间无法执行。

LiuYong_01的博客 1564

tiktok算法协议研究

经过上述分析,可以确定目标字符串来源于一段 JSON 数据,而这段 JSON 数据来自于一个经过加密的本地文件。对字符串 "sdi_v2" 进行 SHA-1 计算,得到 20 字节的结果;将第一步得到的数据进行MD5计算,生成16字节的结果;将第二步的结果转换为十六进制字符串,从而得到 32 字节的密钥。写这种算法分析的帖子真的是太无聊了,就先分析到这里吧,后续有机会再来谈下被加密的本地文件是怎么来的!!自我感觉TT的算法并不难,就是量太大了,所以我想问问有没有感兴趣的朋友来一起分析,欢迎联系。

2503_90751938的博客 2574

数字电子时钟——数字电路课设

本文设计了一种基于中小规模集成电路的数字电子时钟系统,采用模块化设计方法,包含晶振电路(CD4060+D触发器)、计时电路(74HC161计数器)、数码管驱动(CD4511)和整点报时功能。系统实现了60进制秒/分、24进制小时、7进制星期的计时显示,支持手动校时功能,并具备整点报时特性(59分54-58秒5次500Hz低音,59秒1次1000Hz高音)。通过分模块调试与整合,最终实物电路满足设计要求,获得优秀评价。

来自FZU——电子科学与技术专业 1488

Android 使用 Binder IPC

本页介绍了 Android O 中对 Binder 驱动程序进行的更改、提供了有关使用 Binder IPC 的详细信息,并列出了必需的 SELinux 政策。 对 Binder 驱动程序进行的更改 从 Android O 开始,Android 框架和 HAL 现在使用 Binder 互相通信。由于这种通信方式极大地增加了 Binder 流量,因此 Android O 包含了几项改进,旨在...

探索未知,成就非凡 682

24届数字IC设计/验证秋招总结贴——先看这个

为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中整理不易,欢迎订阅~~

qq_42135020的博客 8410

让你一看就明白的binder机制

写在前面网上有很多学习android binder机制的文章和博客,但是大部分或者是深入native不能自拔,看的云里雾里(本人一直使用java,C语言较渣);或者是只讲理论缺乏实际编程的过程。所以就想总结下binder的基本理论并附带一个基于Aidl的进程间的通讯的Demo,希望能对初步接触android binder机制的小伙伴们提供些帮助。当然本人能力有限,如有错误之处还请指教。binder机

关山口男子职业技术学院的猿猴 1732

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android Binder机制(一) Binder的设计和框架

Android Binder机制(一) Binder的设计和框架 首页博客链接关于我留言板 这是关于Android中Binder机制的一系列纯技术贴。花了一个多礼拜的时间,才终于将其整理完毕。行文于此,以做记录;也是将自己所得与大家分享。 和以往一样,介绍Binder时,先讲解框架,然后再从设计和细节等方面一一展开。若文章若错误或纰漏,请不吝指出。谢谢! 注意:本文是基于And

CCJHDOPC的专栏: 4231

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Binder机制解析(一)

一、Binder通信流程简单概述 (一)Binder用以Android内部的进程间通信,Binder相对于传统的Linux内核IPC(管道,信号,消息队列,共享内存,插口等)具有仅需拷贝一次内存的好处,进而提高了效率,也节省了内存;     从设计模式来看,Binder通信可以抽象为上图C/S模式,数据通信流程已经足够清晰。从中可以看出: 1、Client组件获得Service组

woliuyunyicai的专栏 2197

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android Binder 机制学习总结(一)

已经不止一次想要花些时间把Android的Binder机制搞搞明白,最近的工作总算比较清闲,所以花了差不多3周时间,看了一些资料,读了不少代码。现在把这些资料整理下,方便自己以后忘了回来看看。

a220315410的专栏 2755

Android中Binder机制的实现(一)

看了Android的进程间通信好一段时间了,现在把自己的研究成果发上来,供以后和我一样要研究Binder的人参考一下。在看Android源码的过程中,受到了以下文章的帮助和启发,其中我的文章里面也直接引用了一些段落。对文章的作者表示感谢(转贴太多,我都不知道下面的链接是转贴还是原处了。。。): http://hi.baidu.com/albertchen521/blog/item/30c32d3

那些年....的专栏 990

Binder传输机制原理(一)

1 Binder是如何做到精确打击的? 我们先问一个问题,binder机制到底是如何从代理对象找到其对应的binder实体呢?难道它有某种制导装置吗?要回答这个问题,我们只能静下心来研究binder驱动的代码。在本系列文档的初始篇中,我们曾经介绍过ProcessState,这个结构是属于应用层次的东西,仅靠它当然无法完成精确打击。其实,在binder驱动层,还有个与之相对的结构,叫做binder_proc。为了说明问题,我修改了初始篇中的示意图,得到下图: 1.1 创建bind...

heng615975867的专栏 1622

从AIDL一窥Android Binder机制

Binder机制在Android系统中地位毋庸置疑,system_server就通过Binder来实现进程间的通信,从而达到管理、调用一系列系统服务的能力。本文就AIDL来解读一下Binder机制的。 先了解一下如下几个概念: IBinder 、 Binder 、 BinderProxy 、 IInterface IBinder : 根据官方的说明文档IBinder定义的是一种使对象具备远程通信...

Android-DiffUtil以及最新ListAdapter介绍 286

Android中的Binder机制一(实名Binder)

基础概念 在Android中的Binder机制中,主要涉及四部分系统组件,Client、Server、Service Manager、Binder驱动,其中Client、Server、Service Manager运行在用户空间,Binder驱动运行在内核空间。 分析 Service Manger注册管理所有的server,并为client提供查询server的功能,servi...

zhaonhui的博客 5570

Binder通信机制(一)

Binder就是Android中的血管,在Android中我们所使用的的Activity,Service等组件都需要和AMS通信,这种跨进程的通信都是通过Binder完成的。 机制:Binder是一种通信机制 驱动:Binder是一个虚拟物理设备驱动 应用层:Binder是一个能发起通信的Java类 多进程的使用及优势 虚拟机分配给各个进程的运行内存是有限制的,LMK也会优先回收对系统资源占用多的进程 1、突破进程内存限制:如有些功能占据内存过多,可以考虑给一个单独的进程 2、功能稳定性:

l18320786461的博客 2494

Android Binder机制彻底梳理一

Binder架构图: 先来瞅一下它的整体架构图: 其中粉红部分是上层的Binder,而蓝色的则是下层的Binder,很显然上层的是依赖于下层的。 什么是Binder【有个大概了解】? 这里从几个层面来说一下: 从IPC角度来说: 定义:Binder是Android中的一种跨进程通信方式,该通信方式在linux中没有,是Android独有的。 作用:在Android中实现跨进程通信。 从An...

webor2006的博客 260

结合Binder机制看ActivityManager(一)

Binder是一种基于C/S的架构,主要包含四个部分: 服务端 Server;客户端 Client;Binder驱动;ServiceManager 管理远程服务;

Jason_Lee155的博客 1046
上一篇: Java垃圾回收机制(GC原理)解析
下一篇: Binder机制详解(二)
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值