Android跨进程通信--Binder机制及AIDL是什么?

文章目录

  • Binder机制
      • Binder是什么?
      • Binder相对于其他几种跨进程通信方式,有什么区别?
      • 谈一下 Binder IPC 通信过程:
      • 具体的通讯过程是什么?
      • Binder如何处理发送请求与接收请求?
      • Binder是通过什么方式来进行内存映射的?
      • Binder是如何进行管理的?
      • Binder、Socket的数据限制是多少?自己APP如何突破Binder这个限制?
  • AIDL
      • AIDL与Binder之间的关系是什么?
      • AIDL支持哪些数据类型?
      • AIDL一次数据传输能够传输多大的数据?超过限制数据如何处理?

Binder机制

Binder是什么?

Binder是一种进程间通信的机制,Binder就是Android中的血管,在Android中我们使用Activity,Service等组件都需要 和AMS(system_server)进行通信,这种跨进程的通信都是通过Binder完成, Activity,Service等组件和AMS不是同一个进程,其实也是多进程通信。

Binder相对于其他几种跨进程通信方式,有什么区别?

Binder 相对于传统的 Socket 方式,更加高效。 Binder数据拷贝只需要一次,而管道、消息队列、 Socket 都需要 2 次,共享内存 方式一次内存拷贝都不需要,但实现方式又比较复杂。传统的进程通信方式对于通信双方的身份并没有做出严格的验证,比如 Socket 通 信的 IP 地址是客户端手动填入,很容易进行伪造。Binder 机制从协议本身就支持对通信双方做身份校检,从而大大提升了安全性。

谈一下 Binder IPC 通信过程:

  1. 首先 Binder 驱动在内核空间创建一个数据接收缓存区;

  2. 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;

  3. 发送方进程通过系统调用 copyfromuser() 将数据 copy
    到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

具体的通讯过程是什么?

  1. Server向ServiceManager注册。Server通过Binder驱动向ServiceManager注册,声明可以对外提供服务。ServiceManager中会保留一份映射表。
  2. Client向ServiceManager请求Server的Binder引用。Client想要请求Server的数据时,需要先通过Binder驱动向ServiceManager请求Server的Binder引用(代理对象)。
  3. 向具体的Server发送请求。Client拿到这个Binder代理对象后,就可以通过Binder驱动和Server进行通信了。
  4. Server返回结果。Server响应请求后,需要再次通过Binder驱动将结果返回给Client。

当Android系统启动后,会创建一个名称为servicemanager的进程,这个进程通过一个约定的命令BINDERSETCONTEXT_MGR(binderSetconText)向Binder驱动注册,申请成为为ServiceManager,Binder驱动会自动为ServiceManager创建一个Binder实体。并且这个Binder实体的引用在所有的Client中都为0,也就说各个Client通过这个0号引用就可以和ServiceManager进行通信。Server通过0号引用向ServiceManager进行注册,Client通过0号引用就可以获取到要通信的Server的Binder引用。

Binder如何处理发送请求与接收请求?

把发送方的数据放入写缓存(binder_write_read.write_buffer) 【对于接收方来说为读缓存】
接收方之前一直在阻塞状态中,当写缓存中有数据,则会读取数据,执行命令操作
接收方执行完后,会把返回结果同样采用写入缓冲区【对于发送方,为读缓存】

Binder是通过什么方式来进行内存映射的?

mmap() 是操作系统中一种内存映射的方法。内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。

Binder是如何进行管理的?

在这里插入图片描述
在这里插入图片描述

Binder、Socket的数据限制是多少?自己APP如何突破Binder这个限制?

Binder的数据限制为1M-8K。Sockete最大传输数据量为1M。

Binder驱动没有对open,mmap有调用次数的限制,APP可以通过JNI调用open,mmap来突破这个限制,但是会对当前正在进行Binder调用的APP造成不可想象问题,可以先close Binder驱动,但是一旦这个APP没有Binder通信了,这个APP就不能正常使用了。

AIDL

AIDL与Binder之间的关系是什么?

AIDL全称Android接口描述语言,是Android开发工具中提供的一种文件格式,通过在文件中预先定义接口,然后快速生成Binder机制的代码,省去了手动编写Binder机制

在这里插入图片描述

AIDL支持哪些数据类型?

  • 八种基本数据类型:byte、char、short、int、long、float、double、boolean
  • String,CharSequence
  • 实现了Parcelable接口的数据类型
  • List类型。承载数据必须是AIDL支持的类型,或者其他声明的AIDL对象。
  • Map类型。Map承载的数据必须是AIDL支持的类型,或者其他声明的AIDL对象。

AIDL一次数据传输能够传输多大的数据?超过限制数据如何处理?

1M数据。超过限制的数据可以使用 ParcelFileDescriptor来实现超大型文件的跨进程传输。

ParcelFileDescriptor是一个实现了Parcelable接口的类,封装了一个文件描述符,可以通过Binder将它传递给其他进程,从而实现跨进程访问文件或者socket。也可以通过它来创建管道,用于进程间的数据流传输。

好了,跨进程通信就讲到这了,不知道你是否对Binder机制有个大概的认知?如果这篇文章反响不错,博主再更新一下其他的跨进程通信,如Socket

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

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

相关文章

linux入门到精通-第十九章-libevent(开源高性能事件通知库)

目录 参考什么是libevent应用核心实现libevent的地基event_base等待事件产生,循环监听event_loop退出循环监听event_base_loopexit创建事件工作流程 安装一(源码安装,推荐)现在源码配置编译安装验证安装 安装二(可能因…

KingbaseES数据库merge语法

数据库版本:KingbaseES V008R006C008B0014 简介 MERGE 语句是一种用于数据操作的 SQL 语句,它能够根据指定的条件将 INSERT、UPDATE 和 DELETE 操作结合到单个语句中。其主要作用是在目标表和源表之间进行数据比较和同步,根据条件的匹配情况来…

高效并发编程:Java阻塞队列深度解析与最佳实践

1.阻塞队列的基本概念与应用场景 1.1 阻塞队列的定义 阻塞队列(BlockingQueue)是Java并发包中的一个接口,它支持两个附加操作:当队列为空时,获取元素的线程会等待队列变为非空;当队列满时,存储…

RAG概述(二):Advanced RAG 高级RAG

目录 概述 Advanced RAG Pre-Retrieval预检索 优化索引 增强数据粒度 粗粒度 细粒度 展开说说 优化索引 Chunk策略 Small2Big方法 元数据 引入假设性问题 对齐优化 混合检索 查询优化 查询扩展 查询转换 Post-Retrieval后检索 参考 概述 Native RAG&#…

转义字符知识点

转义字符的使用 什么是转义字符? 它是字符串的一部分,用来表示一些特殊含义的字符 比如:在字符串中表现,单引号,引号,空行等等 固定写法 \字符 不同的\和字符的组合表示不同的含义. 常用的转义字符 附…

关于Springboot同时上传文件与其他参数

Springboot同时上传文件与其他参数 http请求数据传递分为请求体和请求参数。跟在url后面的为请求参数,文件上传和json数据放在请求体中。请求参数格式固定,后台可直接解析;请求体中的数据后台需要根据content-type字段按照特定格式解析。con…

shell从入门到精通(23)贪婪匹配、非贪婪以及独占模式

文章目录 贪婪与非贪婪的区别示例贪婪匹配的特点--自动回溯以满足匹配独占模式总结贪婪与非贪婪的区别 在正则表达式中,贪婪匹配和非贪婪匹配是指匹配模式下的不同行为。 贪婪匹配: 贪婪匹配会尽可能多地匹配符合模式的字符。换句话说,它会一直匹配直到无法再匹配为止。例…

springboot vue 开源 会员收银系统 (4) 门店模块开发

前言 完整版演示 前面我们对会员系统 springboot vue 开源 会员收银系统 (3) 会员管理的开发 实现了简单的会员添加 下面我们将从会员模块进行延伸 门店模块的开发 首先我们先分析一下常见门店的管理模式 常见的管理形式为总公司 - 区域管理(若干个门店&#xff…

Java实现插入排序、冒泡排序、堆排序、希尔排序、选择排序、优先队列排序、快速排序、归并排序(详细注释,原理解析)

插入排序 package learn;import java.util.Arrays;/** 每次都将当前元素插入到左侧已经排序的数组中,使得插入之后左侧数组依然有序。* 速度优于选择排序*/ public class InsertSort {public static void insertSort(int[] a) {int n a.length;for (int i 1; i &…

Elasticsearch优点和缺点以及要点和难点具体应用

Elasticsearch是一个开源、分布式、实时的搜索和分析引擎,它位于Elastic Stack(以前称为ELK Stack)的核心。以下是关于Elasticsearch的一些主要特点和功能: 1.分布式和可扩展性:Elasticsearch是分布式的,可以轻松扩展到多个节点以处理大规模数据集和高并发请求。通过将数…

C语言 | Leetcode C语言题解之第113题路径总和II

题目: 题解: int** ret; int retSize; int* retColSize;int* path; int pathSize;typedef struct {struct TreeNode* key;struct TreeNode* val;UT_hash_handle hh; } hashTable;hashTable* parent;void insertHashTable(struct TreeNode* x, struct Tr…

C++干货 --类和对象(二)

前言: 上文中,我们介绍了类这一重要知识点,包括为什么要有类、类的使用方法、封装、以及对象实例化。详情可以去看我的文章:写文章-CSDN创作中心C干货 --类和对象(一)-CSDN博客写文章-CSDN创作中心 这篇文章,我们简单…

我学会了用插件来辅助PostgreSQL,可拷,很刑!

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

【蓝桥杯省赛真题44】python计算N+N的值 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python计算NN的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算NN的值 第十四届蓝桥杯青少年组python省赛真题 一、题目要求…

Makefile学习笔记18|u-boot顶层Makefile04

Makefile学习笔记18|u-boot顶层Makefile04 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。 这里是目录 C语言标准 # With the move to GCC 6, we have implicitly upgraded our language # standard to GNU11 (see https://gcc.gnu.org/…

WordPress--解决迁移后页面404(打不开)的问题

原文网址:WordPress--解决迁移后页面404的问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍WordPress迁移后部分页面404(打不开)的解决方案。 方案:修改固定链接 简介 要在刚建好网站,还没导入数据之前修改固定链接,否则可能导…

【教学类-58-05】黑白三角拼图05(2-10宫格,每个宫格随机1张-6张,带空格纸,1页3张黑白3张白卡)

背景需求: 【教学类-58-04】黑白三角拼图04(2-10宫格,每个宫格随机1张-6张,带空格纸,1页6张黑白,1张6张白卡)-CSDN博客文章浏览阅读582次,点赞16次,收藏3次。【教学类-58…

Mac安装pytorch

先下载 Anaconda | The Operating System for AI 网速慢,用中国大陆镜像:NJU Mirror 之前装python3时用的是pip3,这里说一下这pip与conda的区别 Conda和pip都是Python包管理工具,用于安装和管理Python包 包管理范围&#xff1a…

汽车数据应用构想(一)

自从电动汽车GB/T32960标准颁布,要求所有电动汽车必须上传数据开始,各车厂就开始花费大量的人力物力,用于数据的上传与存储。同时随着智能化、网联化的趋势,不断丰富上传数据的内容与数量。数据已成为车厂的重要资产,但…

Day16

Day16 一、迭代器 深入迭代器-foreach的底层 for (String element : list) {System.out.println(element);}底层: //使用foreach循环遍历集合的底层实现:String element;for(Iterator it list.iterator();it.hasNext();System.out.println(element))e…