当前位置: 首页 > news >正文

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

相关文章:

  • 详解 Cookies 和 WebStorage
  • 软件测试面试题(四)
  • 【经典论文阅读10】MNS采样——召回双塔模型的最佳拍档
  • ffpmeg windows WSl 编译so
  • 【开源】大学生竞赛管理系统 JAVA+Vue+SpringBoot+MySQL
  • leedcode【142】. 环形链表 II——Java解法
  • K8s的常用命令以及yaml文件的创建
  • ABC354学习笔记
  • 基于Arduino IDE的ESP32开发环境搭建
  • PyQt6--Python桌面开发(33.QToolBar工具栏控件)
  • java “错误:编码GBK 的不可映射字符”
  • 云计算和大数据处理
  • 9.1 Go语言入门(环境篇)
  • 增强版 Kimi:AI 驱动的智能创作平台,实现一站式内容生成(图片、PPT、PDF)!
  • C++中string类的初步介绍
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android优雅地处理按钮重复点击
  • ES6之路之模块详解
  • JSDuck 与 AngularJS 融合技巧
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mockjs让前端开发独立于后端
  • MySQL主从复制读写分离及奇怪的问题
  • scala基础语法(二)
  • Spring核心 Bean的高级装配
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 近期前端发展计划
  • 面试总结JavaScript篇
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​低代码平台的核心价值与优势
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • #if等命令的学习
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C#)一个最简单的链表类
  • (JS基础)String 类型
  • (二)springcloud实战之config配置中心
  • (十一)图像的罗伯特梯度锐化
  • (一)Linux+Windows下安装ffmpeg
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .bat文件调用java类的main方法
  • .NET Core 版本不支持的问题
  • .NET Core中如何集成RabbitMQ
  • .NET MVC第三章、三种传值方式
  • .net 发送邮件
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET序列化 serializable,反序列化
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Autowired 和 @Resource 区别的补充说明与示例
  • @private @protected @public
  • @RequestBody与@RequestParam
  • [2019/05/17]解决springboot测试List接口时JSON传参异常