Android开发进阶——binder通讯学习

news/2024/4/24 14:29:11/文章来源:https://blog.csdn.net/m0_62167422/article/details/128438059

什么是binder

  1. 通常意义下,binder指的是一种通信机制
  2. 对Server端来说,Binder指的是Binder本地对象,对于Client端来说,Binder指的是Binder代理对象
  3. 对于传输过程而言,binder是可以跨进程传输的对象

Binder的基本原理

Binder借助了内存映射(mmap)的方法,在内核空间和接收方用户空间的数据缓存区之间做了一层内存映射。从发送方用户空间拷贝到内核空间缓存区的数据,就相当于直接拷贝到了接收方用户空间的数据缓存区,从而减少了一次数据拷贝。

传统Linux IPC机制的缺点

1.1 性能角度

管道、消息队列、Socket实现一次进程通信都需要2次内存拷贝,效率太低;

共享内存虽然不需要拷贝内存,但管理复杂;

Binder只需要一次内存拷贝,从性能角度来看,低于共享内存方式,优于其它方式。

IPC数据拷贝次数
share mm0
Binder1
pipe MQ SOCKET2

binder通信模型

1. 通讯录: ServiceManager

通讯录中保存了每一个人的信息和号码,可以方便去查询。A通过查找B的号码就可以方便的与B进行通讯;

2. 基站:binder驱动

两个人通信不但需要知道号码,还必须有基站的支持才能打电话; 类比到binder机制,两个用户空间的进程,想要通信不但需要通过ServiceManager这个通讯录查找到对方,还需要一个运行在内核空间的基站即binder驱动来完成转发。

binder通信模型

看下面这张图

第一步: ServiceManger的建立,前面说过ServiceManger相当于通讯录,所以说首先要有一个进程向驱动提出申请为ServiceManager,而内核驱动同意后,ServiceManager就负责管理所有的通信号码,这时候还没有人向ServiceManger中注册号码,所以说这时候号码是没有的;

第二步: A同学想要联系B同学,就必须将自己的号码注册到ServiceManager,在每个同学的进程启动之后,随即就会向ServiceManager进行报告,ServiceManager会存储同学的名称以及号码(就是服务的名称和内存地址)。ServiceManger中会建立一张表对应各个同学的名字和电话号码

第三步:就是图中client想要跟Server2通信,需要先通过ServiceManager查询Server2的号码,然后Client就可以通过binder与Server2进行通信了;

binder如何实现跨进程通信

假设client想要调用Server端的add方法,这就是一个跨进程通信的调用;

首先:Server会把自己注册到ServiceManager的查询表中 然后:Client开始查询ServiceManger,拿到Server的代理对象;为什么是代理对象,因为client和server都是在用户空间,binder驱动是在内核空间 无法返回一个真正的server对象,只能返回代理对象,这一层封装对于client是透明的。

以上就是Android中的binder通信的原理;Android的进阶之路还有很多要学习的知识。把这些归纳成一个文档《Android核心技术手册》里面包含30多个技术模块。可以帮助你在Android开发进阶起到效果。需要可以点击前往。

总结

Server端把自己注册到ServiceManager,而Client端想要调用Server端的一个方法比如add方法,它会到ServiceManager中去查询是否有这样的一个方法; 这时候ServiceManager会返回给Client端一个代理对象的add方法,但这个add方法是一个空方法,什么都做不了; 空方法的主要作用是当client端调用add方法时,会返回给内核驱动; 内核驱动接收到了代理对象的add方法,它就知道client端想要调用的是Server端的add方法,这时候内核驱动会去调用Server端的add方法,然后Server端的add方法调用完之后,把结果返回给内核驱动层的ServiceManager,然后ServiceManager再把结果返回给Client,这样就是一个完整的binder跨进程通信原理。

客户端只不过是持有了服务端的代理对象,然后通过代理对象协助驱动去跨进程通信。

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

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

相关文章

MySQL 管理

文章目录启动及关闭 MySQL 服务器MySQL 用户设置/etc/my.cnf 文件配置管理MySQL的命令启动及关闭 MySQL 服务器 首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld如果MySql已经启动,以上命令将输出mysql进程列表…

node.js+uni计算机毕设项目基于微信小程序的美甲预约系统(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

Docker安装Zookeeper教程(超详细)

生命无罪,健康万岁,我是laity。 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑; 第二次,当它在空虚时,用爱欲来填充; 第三次,在困难和容易之…

【Linux】进程间通信之共享内存

目录🌈前言🌸1、System V共享内存🍡1.1、概念🍢1.2、原理🌺2、共享内存相关函数和指令🍡2.1、shmget函数(创建)🍢2.2、shmctl函数(控制)&#x1f…

【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里?

相关博客 【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里? 【自然语言处理】【ChatGPT系列】Chain of Thought:从大模型中引导出推理能力 【自然语言处理】【ChatGPT系列】InstructGPT:遵循人类反馈指令来训练语言模型 【自然语言处理…

基于HTML5 技术的开放自动化HMI

人机交互接口(HMI)是自动化系统中不可或缺的一部分。传统的做法是提供一个HMI 显示屏,并且通过组态软件来配置显示屏的功能,通过modbus 或者以太网与PLC 连接。 现在,事情变得复杂了许多,用户不仅需要通过专…

linux共享内存的使用

共享内存可以由多个程序同时访问的内存,能够避免进程间通信过程中的冗余数据拷贝,是IPC中最快的一种,特别适合用来作大块数据的传输。共享内存可以映射到不同的进程空间,这些进程间的数据传递就不再涉及内核。这个过程其实是把同一块物理内存…

FMOC-PEG-COOH,FMOC-PEG-acid,芴甲氧羰基-聚乙二醇-羧基试剂供应

英文名称:FMOC-PEG-COOH,FMOC-PEG-acid 中文名称:芴甲氧羰基-聚乙二醇-羧基 蛋白质、肽和其他材料通过氨基酸或其他酸活性化学组,增加溶解度和稳定性,降低免疫原性;药物修饰或缓释药物研发,新…

ARM_SMMU_下

SMMU驱动代码分析 本文主要分析linux kernel中SMMUv3的代码(drivers/iommu/arm-smmu-v3.c) linux kernel版本是linux 5.7, 体系结构是aarch64 SMMU的作用是把CPU提交给设备的VA地址,直接作为设备发出的地址,变成正确的物理地址,访问到物理内…

[~/vulhub]/log4j/CVE-2021-44228-20221225

[~/vulhub]/log4j/CVE-2021-44228 ┌──(kwkl㉿kwkl)-[~/vulhub] └─$ cd log4j/CVE-2021-44228 ┌──(kwkl㉿kwkl)-[~/vulhub/log4j/CVE-2021-44228] └─$ dir 1.png 2.png docker-compose.yml README.md README.zh-cn.md┌──(kwkl㉿kwkl)-[~/vulhub/log4j/CVE-2021…

_15LeetCode代码随想录算法训练营第十五天-C++二叉树

_15LeetCode代码随想录算法训练营第十五天-C二叉树 题目列表 110.平衡二叉树257.二叉树的所有路径404.左叶子之和 110.平衡二叉树 题目 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每…

SpringBoot-2 读取properties;自动加载127个类原理总结;全部加载,按需配置

读取properties 方式一:非配置类填写:ComponentConfigurationProperties 1)建立bean: /只有在容器中的组件才拥有springboot提供的强大功能 Component ConfigurationProperties(prefix "mycar") public class Car {private Stri…

NetSuite Decode函数

昨天是平安夜,小家伙仍然为圣诞老人的到来准备了礼物,这是他的传统。每年为了感谢圣诞老人和驯鹿的到来,他都会准备上点心、水果。今年,他认为驯鹿可能需要电力,所以准备了电池给它们享用。 真希望天真一直伴随他的成长…

互联网技术不再是统领,当下正在发生着一场深刻的变革

拥抱实体经济,绝对是当下互联网玩家们的首要选择。无论是头部的互联网企业来讲,还是新生的互联网玩家而言,它们都不约而同地将关注的焦点聚焦在了这样一个方向上。   透过这一点,我们可以非常明显地感受到,一个全新的…

蓝桥杯备赛Day4——多维数组

二维数组初始化 p[[0 for i in range(5)] for j in range(2)] #法一 p[[0]*5 for j in range(2)] #法二 s[[1,2,3],[4,5,6]] print(s) for i in range(2):for j in range(3):print(s[i][j],end ) 三维数组初始化 a[[[0 for _ in range(2)] for __ in…

CSDN每日一练最长递增的区间长度 C语言

题目名称:最长递增的区间长度 时间限制:1000ms 内存限制:256M 题目描述 给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3 (注意:测试用例仅做参考,…

windows@网络防火墙@软件联网控制

文章目录ref打开防火墙控制面板常用部分限制某个软件联网文档参考具体操作取消控制/禁用第三方软件控制ref (Windows) 创建出站端口规则 | Microsoft LearnWindows Defender Firewall with Advanced Security (Windows) | Microsoft Learn组策略 Windows) 高级安全性的 Window…

二叉树经典算法题目

1.二叉树的前中后序遍历(简单) 省略 2.二叉树的深度(简单) 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 例如&a…

VS coda C++、python运行与Dbug配置

首先新建终端 一次性使用C方法 检查C编译器是否存在 which g可见位置存在于:/usr/bin/g 一次性命令格式: 使用json配置文件 运行C方法(推荐): 根据你查找的g的位置来决定 使用配置好的tasks.json(C的…

Java window多环境配置

目录JDK版本下载配置内容描述创建JAVA_HOME在Path配置版本切换效果JDK版本下载 Java8 Download address 这个是Java8 的下载地址,下载是要登录的,自己花费一点时间去注册。如果想要下载其它版本的JDK,请看下面的图,然后你就可以看…