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

news2024/10/7 20:25:03

什么是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.coloradmin.cn/o/114427.html

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

相关文章

【工作流Activiti7】7、Activiti7+SpringBoot

1. 版本问题 1.1. Activiti版本 7.1.0-M6是最后一个支持JDK1.8的版本,此后的版本都要求JDK11以上 目前,Activiti最新版本是7.6.0,它是用JDK11编译的,因此要想使用最新版7.6.0必须升级JDK版本,不能再用1.8 同时&…

【数组中数字出现的次数-有限状态自动机】

数组中数字出现的次数一,有限状态自动机解法二,一般解法想必大家对数组中数字出现的次数的这种题并不少见, 主要有三种: 1,找出数组中只出现一次的数字(其他数字出现两次) 2,找出数组…

渗透测试指操作系统漏洞发现与防御概述

今天继续给大家介绍渗透测试相关知识,本文主要内容是渗透测试指操作系统漏洞发现与防御概述。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调&#x…

Android四大组件之Service

文章目录Android四大组件之默默劳动的Service什么是ServiceAndroid多线程编程线程的基本用法在子线程中更新UI解析异步消息处理机制MessageHandlerMessageQueueLooper异步消息的整个流程使用AsyncTaskService的基本用法定义一个Service启动和停止ServiceActivity和Service进行通…

【4】axi协议学习

1、axi背景介绍: Advanced extensible Interface(AXI)是为了满足高性能系统设计而定义的一套独立通道协议,首次是在2003年发布的AMBA3标准中出现,经历AMBA4,目前已经到达AMBA5版本。 2、axi 特性: AXI满足如下的特性: 适合于高带宽,低延迟的设计 不需要通过复杂的桥…

去耦电容和旁路的概念说明与应用说明

回想当初第一眼看觉得,这啥玩意自己又菜了! 电容:本质就是充放电,实际应该我们围着这个来转 一、解释 旁路电容从英文角度看,就是抄小路的意思,意思当有一个干扰来临时候,可以通过这个电容抄…

LeetCode 1739. 放置盒子:数学 思维

【LetMeFly】1739.放置盒子 力扣题目链接:https://leetcode.cn/problems/building-boxes/ 有一个立方体房间,其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。放置规则如下: …

世界杯竞猜项目Dapp-第五章(合约升级)

目前主流有三种合约升级方法 transparent 方式;(通用,业务逻辑和代理逻辑解耦合,比较贵)uups 方式;(代理逻辑集成到了业务逻辑,通过继承来实现,便宜)beacon 方式&#x…

408 考研《操作系统》第三章第二节:基本分页存储管理、两级页表、基本分段存储管理方式、段页式管理方式

文章目录教程1. 基本分页存储管理的基本概念1.1 连续分配方式的缺点1.2 把“固定分区分配”改造为“非连续分配版本”1.3 什么是分页存储1.4 如何实现地址的转换?1.5 逻辑地址结构1.6 重要的数据结构——页表1.7 知识回顾与重要考点2. 基本地址变换机构2.1 例题2.2 …

node.js+uni计算机毕设项目购物小程序(程序+小程序+LW)

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

不写一行代码(一):实现安卓基于GPIO的LED设备驱动

文章目录系列文章一、前言二、准备工作2.1 内核版本2.2 内核文档:bindings->leds2.3 文档解析: leds-gpio.txt三、编写DTS3.1 查原理图,挑选GPIO3.2 编写DTS文件四、编译测试4.1 编译dt.img4.2 烧录dt.img五、基于fs的测试5.1 测试命令5.2…

第二十五章 数论——约数

第二十五章 数论——约数一、什么是约数二、约数的求解——试除法1、问题2、思路分析3、代码实现三、约数个数1、问题描述2、算法思路3、代码实现四、约数之和1、问题描述2、算法思路3、代码实现五、最大公约数——欧几里德算法1、问题描述2、算法思路(1&#xff09…

前端实现文件上传(点击+拖拽)

一、简介 之前在Vue项目中使用过element的上传组件,实现了点击上传拖拽上传的两种上传功能。然后我就在想是否可以通过原生的htmljs来实现文件的点击上传和拖拽上传,说干就干。 首先是点击获取上传文件自然没的说,只需要借助input标签即可&a…

Java面试题(六)RabbitMQ常见面试题

RabbitMQ常见面试题RabbitMQ架构设计RabbitMQ有哪些优点RabbitMQ事物机制RabbitMQ持久化机制持久化和非持久化什么时候需要持久化?落盘过程文件删除RabbitMQ如何保证消息不丢失RabbitMQ如何保证消息不被重复消费RabbitMQ死信队列,延时队列死信队列延时队…

如何使用 ChatGPT 进行教学,教师可以利用 ChatGPT 的 5 种方式

我们听说过很多关于学生如何使用 ChatGPT 撰写论文和布置家庭作业的信息。 我们一直在讨论围绕这个问题的担忧,并争先恐后地为 ChatGPT 寻找 AI 检测工具,据传 OpenAI 也在致力于此。 但是关于教师如何将 ChatGPT 用于他们自己的工作的讨论并不多。 在从教师的角度对 Chat…

20221222 Coppeliasim的视频导出功能

Video exporter CoppeliaSim的视频记录器可以对the page, scene hierarchy and model browser areas进行录屏,保存成视频文件。Dialogs, menu bar, toolbars and popup menus (对话框、菜单栏、工具栏和弹出菜单)不会被录进去. 默认情况下&am…

【C++11】包装器

目录 1.function包装器 1.1什么是函数包装器(function)&#xff1f; 1.2为啥使用函数包装器(function)&#xff1f; 2.bind包装器 2.1绑定普通函数和调整传参顺序 2.2绑定类成员函数 1.function包装器 头文件#include<functional> 1.1什么是函数包装器(function)&a…

2022年终总结

不知不觉就到了年末&#xff0c;感叹时间过的真快。 我自己坚持写了七年多的博客&#xff0c;但这其实是我第一次去写年终总结。也不知道怎么写&#xff0c;就简单聊聊。 写博客的初衷就是个人收获&#xff0c;学习的记录&#xff0c;分享出来如果能帮到别人那就更好了。毕竟…

(一)LTspice简介2

文章目录前言一、LTspice的仿真过程二、spice的模型三、LTspice的工具栏和快捷键四、LTspice中的数量级前言 上一节我们学习了LTspice的安装&#xff0c;很简单&#xff0c;无脑安装 &#xff08;一&#xff09;LTspice安装 这一节我们继续学习LTspice的简介&#xff0c;主要包…

题:A-B 数对(二分)

A-B 数对 - 洛谷 题目背景 出题是一件痛苦的事情&#xff01; 相同的题目看多了也会有审美疲劳&#xff0c;于是我舍弃了大家所熟悉的 AB Problem&#xff0c;改用 A-B 了哈哈&#xff01; 题目描述 给出一串正整数数列以及一个正整数 CC&#xff0c;要求计算出所有满足 A…