首页 > 系统相关 >Android跨进程通信--Binder机制及AIDL是什么?

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

时间:2024-05-25 20:30:37浏览次数:29  
标签:缓存 AIDL -- Server Binder 内核 进程

文章目录

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

标签:缓存,AIDL,--,Server,Binder,内核,进程
From: https://blog.csdn.net/qq_44023485/article/details/139132344

相关文章

  • android git提交代码命令以及常见命令的使用
    安装GitUbuntu:sudoapt-getinstallgit-core创建代码仓库:配置身份:gitconfig--globaluser.name"Tony"gitconfit--globaluser.email"[email protected]"查看身份:gitconfig--globaluser.namegitconfit--globaluser.email提交代码流程创建本地仓库:进......
  • 论文笔记:Inf-DiT: Upsampling Any-Resolution Image with Memory-Efficient Diffusion
    论文链接:[2405.04312]Inf-DiT:UpsamplingAny-ResolutionImagewithMemory-EfficientDiffusionTransformer(arxiv.org)论文代码:THUDM/Inf-DiT:OfficialimplementationofInf-DiT:UpsamplingAny-ResolutionImagewithMemory-EfficientDiffusionTransformer(gi......
  • [基础]tfcenter mount将Webdav服务挂载成本地磁盘(可显示使用空间)
    1、下载tfcentermount软件(1)点击官网 tfcenter官网 后下载挂载软件(2)以windows挂载为例,下载windows软件包(3)解压软件包,如下图所示2、配置tfcenter挂载(1)以管理员方式运行上图的tfcenter-mount.bat文件选择1安装tfcentermount服务到系统中选择3启动tfcentermount服务......
  • .NET Core中给上传图片的添加水印
    一.安装System.Drawing.Common库工具->NuGet包管理->程序包管理控制台输入命令Install-PackageSystem.Drawing.Common二.代码案例实现usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingSy......
  • 101. 对称二叉树
    给定一个二叉树,检查它是否是镜像对称的。思路:判断左子树和右子树是否可以相互翻转。外侧与外侧比较,内侧与内侧比较。使用哪种遍历方式?这道题只能使用后序(左右中)。因为我们要不断收集左右孩子的信息,返回给上一个节点。然后判断以根节点的左孩子为根节点的信息,和根......
  • Python 潮流周刊#52:Python 处理 Excel 的资源
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期周刊分享了12篇文章,12个开源项目,赠书5本《网络是怎样连接的》,全文1......
  • HandyControl发现bug
    HandyControl3.4以上的版本 ListView 这样写不显示数据,3.4可以<Grid><Grid.RowDefinitions><RowDefinitionHeight="40"/><RowDefinition/><RowDefinition/></Grid.RowDefinitions&g......
  • Ceph配置与认证授权
    目录Ceph配置与认证授权1.为什么现在不采用修改配置文件的方式了呢?2.Ceph元变量3.使用命令行修改配置3.1全部修改(使用服务名)3.2部分修改(修改进程)3.3临时生效3.4配置项3.5老版本提供的配置文件3.Ceph网络3.1对现有集群加入clusternetwork4.Cephx(认证授权)4.1认证......
  • 2024XJTUPC西安交通大学校赛VP题解
    每次vp都自闭,已成习惯,时间还是分配的不合理,debug时做太多无用功。一键做题A.交小西的礼物输出a+b+2c+3d即可#pragmaGCCoptimize(3,"Ofast","inline")#include<bits/stdc++.h>#defineinf0x3f3f3f3f3fusingnamespacestd;usingll=longlong;usingpii=......
  • MMM全链接聚类算法实现
    使用时,仅需修改TODO下描述的字段即可,其他无需改动。#include<bits/stdc++.h>//TODO:根据需求分别修改任务数、每个模块内最大任务数、模块数、步进长度#defineTASK_NUM(8)#defineMAX_TASK_NUM(4)#defineMODULE_NUM(2)#defineGRANULARITY(0.5)......