Android开发血动脉——Binder机制

news2024/12/23 23:07:02

Binder是Android中的一个类,它继承了IBinder接口。从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在linux中没有。从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager、WindowManager,etc)和相应ManagerService的桥梁。

从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当你bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。

为什么Android要选择Binder?

Linux也有一些很优秀的进程间通信机制,例如管道,消息队列,共享内存,socket等,但是为什么Android使用Binder而不是这些呢? 看Binder与共享内存,socket的对比。

Binder机制的工作流程

  1. 客户端获取服务端的带来对象(proxy)。我们需要明确的是客户端进程并不能直接操作服务端中的方法,如果要操作服务端中的方法,那么有一个可行的解决方法就是在客户端建立一个服务端进程的代理对象,这个代理对象具备和服务端进程一样的功能,要访问服务端进程中的某个方法,只需要访问代理对象中对应的方法即可;
  2. 客户端通过调用代理对象向服务端发送请求。
  3. 代理对象将用户请求通过Binder驱动发送到服务器进程;
  4. 服务端进程处理客户端发过来的请求,处理完之后通过Binder驱动返回处理结果给客户端的服务端代理对象;
  5. 代理对象将请求结果进一步返回给客户端进程。

通过以上5个步骤,就完成了一次Binder通信。

Binder机制的组成

Binder机制由三部分组成,即:

1.Client;

2.Server;

3.ServiceManager。

三部分组件之间的关系:

  • Client、Server、ServiceManager均在用户空间中实现,而Binder驱动程序则是在内核空间中实现的;
  • 在Binder通信中,Server进程先注册一些Service到ServiceManager中,ServiceManager负责管理这些Service并向Client提供相关的接口;
  • Client进程要和某一个具体的Service通信,必须先从ServiceManager中获取该Service的相关信息,Client根据得到的Service信息与Service所在的Server进程建立通信,之后Clent就可以与Service进行交互了;
  • Binder驱动程序提供设备文件/dev/binder与用户空间进行交互,Client、Server和ServiceManager通过open和ioctl文件操作函数与Binder驱动程序进行通信;
  • Client、Server、ServiceManager三者之间的交互都是基于Binder通信的,所以通过任意两者这件的关系,都可以解释Binder的机制。

Android Binder开发技术,摘要自《Android核心技术手册》笔记文档。点击可以查看详细类目。

Binder通信原理

1、动态内存可加载模块

我们之前提到的传统Linux IPC机制如管道,Socket套接字都是属于内核的一部分,通过内核的支持来实现跨进程通信,但是Binder并不是Linux系统内核的一部分。得益于Linux的 动态内核可加载模块 机制,Android系统通过动态的将Binder驱动添加到内核空间链接到内核作为其一部分运行。

2、内存映射

传统的 IPC 机制如管道、消息机制、Socket 都是需要拷贝两次数据

copy_from_user() //将数据从用户空间拷贝到内核空间
copy_to_user() //将数据从内核空间拷贝到用户空间

(共享内存不需要拷贝数据),而Binder数据拷贝只需要一次。这涉及到内存映射

Binder机制中的内存映射是通过mmap() 来实现的,简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。

一次完整的 Binder IPC 通信过程通常是这样:

  1. 首先 Binder 驱动在内核空间创建一个数据接收缓存区;
  2. 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;
  3. 发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

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

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

相关文章

cocosCreator 之 3.8打包注意事项

版本: v3.8.0 环境: Mac 介绍 曾编写过一篇文章: cocosCreator笔记 之 Android打包 使用的版本是: v3.4.0 在官方发布最新版本3.8.0后,就编写了Demo尝试打包发布下,结果一路的报错问题。 写此博客&…

linux 下安装chrome 和 go

1. 安装google-chrome 1.1 首先下载google-chrome.deb安装包 之后 安装 gdebi包 sudo apt install gdebi 1.2 安装所要安装的软件 sudo gdebi code_1.81.1-1691620686_amd64.deb 1.3 解决Chrome无法启动问题 rootubuntu:~/Downloads# whereis google-chrome google-chrome…

去除字符串中的数字(字符串的拼接memcpy(str2[j],str1[i],1);)

1 题目 去除字符串中的数字 删除一个字符串中的所有数字字符。 例如: 输入:cat4lion25film 输出:catlionfilm 2 考察点 1 字符串的拼接使用2 数字和字母的acill码 3 答案 3.1 官网答案(厉害了方法学习下) /* 删…

mysql数据无法写入汉字的解决办法

存在问题: mysql数据库不能写入汉字; 解决方案: 打开表设计,把相应位置字符集改为utf-8

【爬虫】实验项目一:文本反爬网站的分析和爬取

目录 一、实验目的 二、实验预习提示 ​编辑 三、实验内容 四、实验要求 五、实验过程 1. 基本要求: 2. 改进要求A 3. 改进要求B: 六、资料 1.实验框架代码: 2.OpenSSL:Win32/Win64 OpenSSL Installer for Windows - Shining Light…

数据时代的必备利器:数据可视化工具的崭新价值

在当今信息时代,数据扮演着越来越重要的角色,而数据的可视化呈现正是一种强大的工具,能够帮助我们更好地理解和利用这些数据。虽然Excel和PPT在处理数据方面有着不可否认的作用,但在处理大规模、复杂数据时,数据可视化…

18.Oauth2-微服务认证

1.Oauth2 OAuth 2.0授权框架支持第三方支持访问有限的HTTP服务,通过在资源所有者和HTTP服务之间进行一个批准交互来代表资源者去访问这些资源,或者通过允许第三方应用程序以自己的名义获取访问权限。 为了方便理解,可以想象OAuth2.0就是在用…

百度等8家企业首批上线大模型服务;大语言模型微调之道

🦉 AI新闻 🚀 百度等8家企业首批上线大模型服务 摘要:百度、字节、中科院旗下8家企业/机构的大模型通过备案,正式面向公众提供服务。百度旗下AI大模型产品文心一言率先开放,用户可下载App或登录官网体验。百川智能也…

【前端自动化部署】,Devops,CI/CD

DevOps 提到Jenkins,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合,是一种方法论,并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…

高级DBA手把手教你Mysql大数据量批量导入人大金仓国产数据库方法(全网最详细)

Mysql数据批量导入人大金国产数据库方法 参考下面地址,先安装好整体的安装包到电脑上 https://blog.csdn.net/nasen512/article/details/132599267迁移工具安装方法查看我另一篇上面地址的文章,作者是全量安装金仓自带的windows迁移程序! 1、打开官方…

微信小程序原生框架转Uni-App:你需要知道的一切

目录 微信小程序原生框架转Uni-App:你需要知道的一切引言目录为什么选择Uni-App准备工作文件结构调整代码转换API适配微信小程序:获取用户地理位置Uni-App:获取用户地理位置对比与分析 测试与调试总结与建议 博主 默语带您 Go to New World. …

CGLIB 问题

全部错误信息如下:(为了大家能搜到,拼了,全部截下来~) [main] INFO org.springframework.aop.framework.CglibAopProxy - Final method [protected final org.hibernate.Session org.springframework.orm.hibernate5.s…

【算法笔记】二维的哈希与迭代转换;Runtime Error 的解决思路

https://vjudge.net/problem/UVA-11019 如何对一个二维数组进行哈希 对于一个一维数组A(1*M),哈希的方式是: s e e d M − 1 ∗ A [ 0 ] s e e d M − 2 ∗ A [ 1 ] s e e d M − 3 ∗ A [ 2 ] . . . s e e d 0 ∗ A [ M − 1 ] seed^{M-1}*A[0] …

继续绷紧油市神经,市场预计沙特10月继续自愿减产

KlipC报道:据了解,市场参与者大都认为沙特阿拉伯将会把自愿额外减产的措施延长至10月底,以寻求在经济低迷的背景下提振油价。 KlipC的合伙人Andi D表示:“今年5月起,沙特就自愿减产日均50万桶原油,今年6月初…

app加固怎么做?

app加固是一种保护应用程序免受攻击的技术,可以防止未经授权的访问、数据泄露和其他安全问题。下面是一些app加固的最佳实践: 1.加密和数据保护:对应用程序的数据进行加密和保护,以防止未经授权的访问和数据泄露。您可以使用AES、…

工具及方法 - 色彩分析仪

在手机或其他带有显示屏的产品开发中,需要对显示屏显示的颜色进行测量,就会用到色彩分析仪。 看到别人在使用的一款,就是CA-410 display color analyzer,柯尼卡美能达CA-410高精度色彩分析仪。(Konica Minolta) 产品页链接&#x…

【输入法】Knife4j打字时,莫名其妙删除文本

一直以为是ui的问题,想着升级下Knife4j,无意中发现切换输入法后,该问题不复现。 遂卸载QQ拼音输入法6.6

信息图片怎么做二维码?图片生码的操作方法

现在很多人会将自己的证件信息的图片生成二维码使用,那么图片转二维码的操作方法是什么样的呢?想要将图片生成二维码的方法非常简单,利用二维码生成器(免费在线二维码生成器-二维码在线制作-音视频二维码在线生成工具-机智熊二维码…

降噪音频转录 Krisp: v1.40.7 Crack

主打人工智能降噪服务的初创公司「Krisp」近期宣布推出音频转录功能,能对电话和视频会议进行实时设备转录。该软件还整合的ChatGPT,以便快速总结内容,开放测试版于今天上线。 随着线上会议越来越频繁,会议转录已成为团队工作的重…

国标GB28181视频平台EasyGBS国标视频云平台级联到EasyCVR,上级平台无法播放通道视频的问题解决方案

EasyGBS国标视频云平台是基于国标GB28181协议的视频能力兼服务平台,可实现的视频能力包括将设备通过国标GB28181协议接入、流媒体转码、处理及分发、直播录像、语音对讲、云存储、告警、平台级联等功能。其中,平台级联功能是指平台与平台之间可以通过国标…