【Android】Binder机制在Android中的原理和使用

news/2024/3/29 16:32:02/文章来源:https://blog.csdn.net/a1341398182/article/details/130349162

Binder机制在Android中的原理和使用

Binder机制概述

Binder是Android的一种跨进程通信机制,它允许不同进程间进行通信,甚至可以跨设备进行通信。Binder通常用于实现Android Framework与App之间的通信,也用于App之间的通信。

Binder机制是Android框架的基石,深入理解Binder机制有助于我们更好地理解Android系统的工作原理。本文将从Binder的原理出发,全面介绍Binder在Android中的使用和工作流程。

Binder原理概述

Binder机制运用的是一个C/S(Client/Server)架构,客户端进程发送请求,服务端进程接收请求并返回结果。Binder机制的实现是基于Linux的Binder驱动,Binder驱动可以理解为一个消息传递的通道,各个进程通过读取和写入这个通道来实现跨进程通信。

当Client进程调用Server中的binder方法时,Binder驱动会将这个方法调用转换成一条Binder消息,这条消息会发送到Server进程。Server进程收到消息后,Server中的Binder线程池会按照一定的调度策略选取一个空闲线程来处理这条消息,最终执行Server端的binder方法。执行完后,会将结果打包成Binder消息发送回Client进程,Client进程收到消息后会从驱动中读取结果,最终解包使用。这就是Binder机制的整个调用流程。

Binder的使用

定义接口

Binder机制通常用于实现进程间的接口调用,我们需要先定义Binder接口。一个典型的Binder接口如下:

public interface IBookManager {public void addBook(Book book);public void deleteBook(int bookId);public Book getBook(int bookId);public List<Book> getBooks();
}

这是一个书管理的Binder接口,包含增加书籍、删除书籍、获取书籍等方法。

实现Binder接口

然后我们需要实现上面的Binder接口,并继承自Binder类,这样这个类的实例就代表了一个Binder实体,可以跨进程传输。

public class BookManager extends Binder implements IBookManager {public void addBook(Book book) { ... }public void deleteBook(int bookId) { ... }public Book getBook(int bookId) { ... }public List<Book> getBooks() { ... }
} 

在Server端注册Binder实体

在提供服务的进程内,我们需要将Binder实体注册到ServiceManager中。这样当其他进程想访问这个Binder实体时,就可以从ServiceManager中获取它。

public class BookManagerService extends Service {private final BookManager bookManager = new BookManager();public void onCreate() {super.onCreate();publishBinderService(CMD_BOOK_MANAGER, bookManager);}
}

onCreate()方法中我们通过publishBinderService()方法将bookManagerBinder实体发布到ServiceManager中,这样其他进程就可以通过CMD_BOOK_MANAGER这个key来获取这个Binder实体了。

在Client端获取Binder代理并调用

在客户端进程中,我们可以通过ServiceManager访问Server发布的Binder实体。

public void queryBookManager() {// 获取ServiceManager的代理IBinder service = ServiceManager.getService(CMD_BOOK_MANAGER);// 通过服务端返回的IBinder对象生成Binder代理IBookManager bookManager = IBookManager.Stub.asInterface(service);// 通过代理调用服务端的方法List<Book> books = bookManager.getBooks();... 
} 

我们首先通过ServiceManager获取要访问的Binder实体,这个会返回一个IBinder对象。然后通过IBookManager.Stub.asInterface(service)IBinder对象转成客户端所需的IBookManager接口类型,这个对象就是Binder代理。我们可以通过这个代理对象调用服务端IBookManager接口中的方法。

至此,我们完成了一个跨进程的Binder通信的全过程。客户端通过Binder代理访问服务器提供的服务,服务器通过Binder实体来处理客户端的请求。这整套机制都建立在Binder驱动之上,Binder驱动负责将双方的请求和回复进行传递。

Binder通信的底层原理

我们上面简单介绍了Binder通信的使用过程,下面来深入分析Binder通信的底层实现原理。

Binder通信的底层实现依靠的是Linux的Binder驱动框架。当客户端的Binder线程向服务端的Binder对象发送请求时,请求会被打包成一条Binder消息,这条消息会通过write()系统调用写入到Binder驱动中。Binder驱动会将消息发送到服务端进程的Binder线程池中。

服务端的某个Binder线程会从驱动中读取这条消息,解析后调用服务端的Binder对象来处理请求。处理完成后,服务端也会将结果打包成一条Binder消息写入到驱动中。这条消息最终会传递到客户端,客户端的Binder线程会从驱动中读取消息,得到服务端的回复。

从上面的过程可以看出,Binder驱动扮演了消息传递的媒介角色,实际上完成客户端与服务端的通信。客户端和服务端的Binder线程通过读写驱动中的消息来实现进程间的调用。这种机制的优点是简单高效,并且Binder驱动已经处理好了跨进程调用所需要解决的低层问题,如线程同步、内存拷贝等,我们只需要关注更高层的Binder接口设计和业务逻辑处理。

  1. 客户端的Binder线程调用transact()方法,将请求的参数打包成Binder消息(binder_write_read结构体)

  2. 客户端的Binder线程通过write()系统调用,将请求消息写入Binder驱动

  3. Binder驱动接收到消息,查找服务端的进程并将消息转发给服务端的Binder线程池

  4. 服务端的某个Binder线程通过read()系统调用读取Binder驱动中的请求消息

  5. 服务端的Binder线程解析消息,执行请求需要调用的服务端Binder对象的方法

  6. 服务端的Binder线程将结果打包成回复消息(binder_write_read结构体)

  7. 服务端的Binder线程通过write()系统调用,将回复消息写入Binder驱动

  8. Binder驱动接收到消息,查找客户端的进程并将消息转发给客户端的Binder线程池

  9. 客户端的Binder线程通过read()系统调用读取Binder驱动中的回复消息

  10. 客户端的Binder线程将收到的回复消息返回给Step1的transact()方法调用

  11. transact()方法在获得回复消息后返回,客户端得到服务端的调用结果

可以看到,Binder通信的整个过程,客户端和服务端的交互其实都是通过Binder驱动中的消息传递来完成的。Binder驱动作为媒介,屏蔽了跨进程通信中的底层细节,大大简化了开发者的工作。

Binder线程池

在Binder通信的过程中,我们提到过Binder线程池。每个进程中的Binder通信都是通过线程池中的Binder线程来完成的。那么这个Binder线程池是如何工作的呢?

每个进程启动时,会启动一定数量的Binder线程,这些线程就构成了Binder线程池。当客户端的Binder接口发出跨进程请求时,请求会被放入工作队列中,线程池的某个空闲线程会从队列中取出请求,调用transact()方法与Binder驱动进行数据交换,并最终执行服务端的Binder对象方法。

同理,当服务端的Binder对象完成请求处理后,也需要向客户端发送回复,这个过程也需要线程池中的某个空闲线程来完成与驱动的通信。

由此可见,Binder线程池中的线程不断从工作队列中取出请求并与驱动通信,实现了客户端请求的发送和服务端回复的发送。如果工作队列中有大量请求积压,线程池可以通过创建更多线程来应对,这就实现了Binder通信的并发能力。

每个Binder线程与Binder驱动建立了一个会话,用于发送和接收消息。在进程启动时会创建多个会话,这些会话会被线程池中的线程复用。当某条请求需要与驱动交互时,线程会选择一个空闲会话来使用,使用完后回收到会话池中,以供其他线程使用。

  1. 客户端的Binder接口调用会被加入工作队列

  2. 线程池中的某个空闲线程会从工作队列中取出请求

  3. 取出的线程会从会话池中获取一个空闲会话与Binder驱动交互

  4. 交互完成后,线程会回收会话到会话池,等待下一请求使用

  5. 如果工作队列中的请求较多,可以通过创建更多线程来增加处理能力

这就是Binder线程池的基本工作机制,它实现了Binder通信的并发以及客户端与驱动、服务端与驱动的交互工作。Binder线程池的可扩展性也可以根据请求量进行动态调整,这使得Binder机制可以应对不同级别的并发请求。

至此,我们对Binder机制的原理有了比较全面和深入的了解。Binder机制作为Android Framework和App之间的基石,理解Binder的工作原理可以帮助我们更好地理解Android系统的工作机制,也可以更高效地进行Binder协议的设计与开发。

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

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

相关文章

商品价格监控业务场景,API数据分析

商品价格监控指的是对特定商品价格进行实时监控和跟踪&#xff0c;及时更新最新价格并分析价格变化的行为。这种监控可以帮助企业及时了解市场行情&#xff0c;并根据价格变化情况做出相应的调整&#xff0c;以更好地应对市场变化。 一般来说&#xff0c;商品价格监控需要以下…

KVM虚拟机的磁盘无损扩容方法-qcow2格式的

起因&#xff1a;我的KVM主机上安装了基于Debian11的 虚拟机母鸡&#xff0c;其他虚拟机都由此克隆而来。因为最初只配置了8G的虚拟硬盘&#xff0c;因此在需要占用比较大的空间的应用时&#xff0c;就比较麻烦。度娘等中文搜索结果没找到答案&#xff0c;只能google了。 这里…

JavaScript概述四(DOM文档对象模型)

1.DOM(Document Object Model) 会把网页里面的元素当成对象去操作,包含对象的属性,属性值,方便我们去 操作网页。 整个页面最终会形成一个对象 :document ,页面里面的所有的元素(如 标签 ) 最终都会转换成 js 里面的对象。 1.1 获取页面的元素&#xff08;通过选择器&#xff0…

JS-11A/224时间继电器 JOSEF约瑟 板前、板后接线

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

数据结构与算法(三):数论(树形结构、二叉树、二叉搜索树、红黑树、Btree、B+Tree、赫夫曼树、堆树)

数论&#xff08;树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树&#xff09; 树形结构概念 在树形结构里面重要的术语&#xff1a; 结点&#xff1a;树里面的元素。 父子关系&#xff1a;结点之间相连的边 子树&#xff1a;当结点大于1时&#xff0…

华为OD机试真题(Java),数字涂色(100%通过+复盘思路)

一、题目描述 疫情过后&#xff0c;希望小学终于又重新开学了&#xff0c;三年二班开学第一天的任务是将后面的黑板报重新制作。 黑板上已经写上了N个正整数&#xff0c;同学们需要给这每个数分别上一种颜色。 为了让黑板报既美观又有学习意义&#xff0c;老师要求同种颜色的…

LoadRunner参数化最佳实践:让你的性能测试更加出色!

距离上次使用loadrunnr 已经有一年多的时间了。初做测试时在项目中用过&#xff0c;后面项目中用不到&#xff0c;自己把重点放在了工具之外的东西上&#xff0c;认为性能测试不仅仅是会用工具&#xff0c;最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作。这算…

QMS-云质说质量 - 1 张小泉的质量危机

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 引言 百年老店的拍蒜质量门 最近张小泉拍蒜断刀事件&#xff0c;吸引了全民关注&#xff0c;虽然随后发布了“断刀召集令”&#xff0c;但从事件发生到后续拖沓且不专业的应对&#xff0c;张小泉肯定是“失蒜”了。 张小泉…

Spring Security实战(六)—— 跨域与CORS

跨域是一种浏览器同源安全策略&#xff0c;即浏览器单方面限制脚本的跨域访问。 一、认识跨域 跨域&#xff08;Cross-Origin&#xff09;指的是在Web开发中&#xff0c;当一个网页的内容要从不同源&#xff08;即不同的域名、协议或端口&#xff09;获取时&#xff0c;就会发…

ajax的介绍及使用

ajax的介绍 开发流程 前端 ajax:前后端沟通的桥梁 后端 ajax介绍 ajax叫做异步的Javascript和xml ajax通过浏览器与服务器&#xff08;后端&#xff09;进行少量数据交互&#xff0c;进行页面异步更新&#xff08;网页不会重新加载&#xff09; 优点&#xff1a; 减轻服务器负…

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页---前后端分离)、axios加载失败)

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页—前后端分离)、axios加载失败) Vue cli CLI是Commond-Line Interface&#xff0c;翻译为命令界面&#xff0c;又称脚手架。VueCLI是一个官方发布vue.js项目脚手架。使用VueCLI可以快速搭建vue开发…

v-for比v-if优先级更高?面试官:回去等通知吧

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 v-if和v-for哪个优先级更高呢&#xff1f;这是面试官常常问到的一个问题&#xff0c;…

算法训练 Day41 | 动态规划

343. 整数拆分 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 确定递推公式&#xff1a;dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

3.Spring Security实现JWT token验证

目录 1. Spring Security详细介绍 2. Spring Security详细使用 3. Spring Security实现JWT token验证 4. JWT&#xff08;JSON Web Token&#xff0c;JSON令牌&#xff09; 5. Spring Security安全注解 Spring Security实现JWT token验证 Spring Security是Spring提供的一…

【Spring篇】DI相关内容

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、setter注入 1.环境准备 2.注入引用数据类型 3.注入简单数据类型 二、构造器注入 1.环境准备 2.构造器注入引用数据类型 3.构造器注入多个引用数据类型 4.构造器注入多个简单数据类型 …

SAS学习第4章:t检验

前话&#xff1a;分析试验数据的差异&#xff0c;一般都会假设样本值之间或者样本与标准值之间无差异&#xff0c;根据不同方法计算得出的t值、q值、F值等等&#xff0c;均表示两者之间的差异程度&#xff0c;值越大&#xff0c;两者差异越大&#xff0c;该假设越不成立&#x…

Vue3+Three.js+antvG2实战项目 智慧城市(三)

前言 在网上找了很久都没有找到使用Three.js开发智慧城市的免费文章或者免费视频,自己花了一点时间做了一个纯前端的智慧城市项目。 技术栈都是最新的:vue3vitetypeScriptThreeantv G2 源码分享 源码 模型,天空图盒子链接分享(不想下载源码可以只用下这个)提取码1234 20230424_…

TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

https://www.usenix.org/conference/osdi18/presentation/chen 文章目录 TVM: An Automated End-to-End Optimizing Compiler for Deep Learning引言1. 简介2. 总览3. 优化计算图4. 生成张量运算4.1 张量表达式和调度空间4.3 嵌套并行与协作4.3 张量化4.4 显式内存延迟隐藏 5 .…

跌倒检测和识别4:C++实现跌倒检测(含源码,可实时跌倒检测)

跌倒检测和识别4&#xff1a;C实现跌倒检测(含源码&#xff0c;可实时跌倒检测) 目录 跌倒检测和识别4&#xff1a;C实现跌倒检测(含源码&#xff0c;可实时跌倒检测) 1. 前言 2. 跌倒检测模型&#xff08;YOLOv5&#xff09; &#xff08;1&#xff09;跌倒检测模型训练 …

2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

4月22日&#xff0c;2023首届云数据库技术沙龙 MySQL x ClickHouse 专场&#xff0c;在杭州市海智中心成功举办。本次沙龙由玖章算术、菜根发展、良仓太炎共创联合主办。围绕“技术进化&#xff0c;让数据更智能”为主题&#xff0c;汇聚字节跳动、阿里云、玖章算术、华为云、腾…