Binder对象的流转(系统服务的调用过程、AIDL的使用过程)

零、Binder的传递

Android系统中,存在大量的 IPC 交互,同时也使用了大量的 Binder,那么Binder是怎么在各进程中进行对象的传递?

一、调用系统服务时,Binder的传递

请添加图片描述

回忆一下,Android系统的启动流程:Kernel——>Init进程——>Zygote——>SystemServer,在SystemServer启动时,会启动大量的系统级服务:AMS,PMS,WMS,InputManagerService等。
这些系统服务会注册到ServiceManager上,客户端是从ServiceManger中拿到要使用的系统服务对象,再调用服务的方法。

SystemServer 想要把服务注册到 ServiceManger 上:先拿到 IServiceManager 的proxy引用,调用 addService 方法将服务注册到 ServiceManager 的。

当客户端想调用系统服务时,通常会有以下写法:

LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

往getSystemService方法传入一个字符串,返回服务的一个对象,然后就可以使用了。
客户端与 ServiceManager 处于两个进程中,想从 ServiceManager 中拿到服务对象,就涉及到 IPC 调用。其实也是客户端首先拿到 IServiceManager的proxy对象,调用getService() 方法取得服务对象的。

总结一下:

  1. SystemServer 中运行的服务要注册到 ServiceManager上。即 IPC1
  2. 客户端从 ServiceManager 中获取服务对象。即 IPC2
  3. 客户端拿到服务对象,在调用的时候,客户端使用的是 Binder对象的 proxy,实际运行的 Binder 在 SystemServer 进程中。即 IPC3

二、AIDL使用时的Binder传递

回忆下AIDL的使用:

  1. 定义AIDL 文件
  2. 编译生成 Stub 模板代码
  3. 定义服务端 Service,公布 Binder对象
  4. 定义客户端 使用bindService方法,在回调中拿到 Binder的 proxy对象

问题就在于,服务端 return的 Binder 对象是怎么传到 客户端的?
请添加图片描述
具体的代码调用流程就不贴了,画了一张图,使流程简化些讲解。

bindService(serviceIntent, new ServiceConnection() ...

客户端调用 bindService,传入一个 ServiceConnection 对象,在 ContextImpl.bindServiceCommon 中,传入到 ServiceDispather,伪代码如下:

class ServiceDispather {
	ServiceConnection conn;
	InnerConnection innerConn; // 为AMS回调,埋下伏笔
}

class InnerConnection extends IServiceConnection.Stub

InnerConnection 继承自IServiceConnection.Stub,为AMS回调 Binder 预留接口,AMS为客户端,InnerConnection是服务端。
最终客户端收 Binder对象时,也就是AMS调用 onConnected 时,将 Binder 通过 InnerConnection 传到客户端,再转发到 ServiceConnection中。

AMS收到bindService() 请求,调 requestBinding 将请求传到 服务端,在服务端的 onBind() 方法中 return Binder对象,委托AMS发布此Binder,AMS中存有 InnerConnect的代理对象,将Binder传到客户端去,ServiceDispather 调用 ServiceConnection 暴露 Binder对象给上层应用。

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

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

相关文章

数据结构--》从数据结构开始,打好算法基础

目录 数据结构的基本概念 数据结构的三要素 算法的基本概念 数据结构的基本概念 在学习某个知识之前,我们是否都有问过自己我们到底在学习的目的是什么?学习数据结构也一样,我们学习数据结构主要是为了用程序把现实世界的问题信息化&#…

Fiddler之日常使用简介

目录 前言: Fiddler界面简介 一、Fiddler抓取http、https请求配置 二、抓取指定域名会话 三、http请求统计试图 前言: Fiddler是一款功能强大的Web调试工具,它可以帮助开发人员在开发和测试过程中捕获、修改和检查HTTP请求和响应。 使用Fiddl…

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源:力扣(LeetCode) 链接:https://leetcode.cn/problem…

leetcode46. 全排列(回溯算法-java)

全排列 leetcode46. 全排列题目描述解题思路代码演示 回溯算法专题 leetcode46. 全排列 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/permutations 题目描述 给定一个不含重复数字的数组 nums ,返回其 所有…

pandas---文件读取与存储(csv、hdf、json、excel、sql)

数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格 式,如CSV、SQL、EXCEL、JSON、 HDF5。 1. csv文件 pandas.read_csv(filepath_or_buffer, sep ,, usecols ) filepath_or_buffer:文件路径 sep :…

组合式API - provide和inject、Vue3小案例【Vue3】

组合式API - provide和inject 作用和场景:顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信 跨层传递普通数据 顶层组件通过provide函数提供数据 provide(key, 顶层组件中的数据)底层组件通过inject函数获取数据 const message inject(key) …

Windows 禁止 IE 自动跳转 Edge「整合方案」

前言 IE 已经合并进 Edge 浏览器,IE「正式入土」 RESPECT ​ 昨晚,公司系统更新(Edge)结束后,原本正常运行的 RPA 全部下线,原因如图: ​ 早上起来,又是充满希望的一天,于…

走进人工智能|机器学习 解码未来的科技革命

前言: 机器学习的发展为我们提供了更智能、高效和便捷的科技产品和服务,可以改善我们的生活和工作方式。 文章目录 序言背景解码未来的科技革命技术支持应用领域程序员如何学总结 序言 机器学习是一种人工智能领域的技术,它让计算机通过数据自动地学习和…

微服务SpringCloudday1 认识微服务与服务注册(Eureka与nacos)

SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

基于立创EDA的原理图设计

目录 学习目标 一、开发中原理图的作用 1.1 原理图 1.2 产品开发原理图设计阶段 1.3 原理图中的具体工作内容 二、 立创EDA软件使用基础 2.1 立创EDA电路设计软件 2.2 新建工程 2.3 设计元件原理图封装 三、项目实战(单片机最小系统) 学习目标…

异常的介绍与处理

目录 第七章 异常 1.异常 2.处理方法 2.1.try-catch 2.2.多重catch块 2.3.finally 2.4.throw 与 throws 2.5.程序分析 3.自定义异常 内容仅供学习交流,如有问题请留言或私信!!!!! 有空您就点点赞…

Vue中如何进行颜色选择与取色器?

Vue中如何进行颜色选择与取色器? 在Web开发中,颜色选择器是一个非常常见的功能。在Vue.js中,我们可以使用现成的颜色选择器组件或者自己编写一个颜色选择器组件。本文将介绍如何在Vue.js中实现颜色选择器组件和取色器功能。 颜色选择器组件 …

Elasticsearch 基本使用(一)写入数据

写入数据 查询索引状态写入一条数据查询数据按id查询一条 类比 getById不按id查 写入官方测试数据 查询索引状态 GET _cat/indices写入一条数据 PUT/POST my_index/_doc/1 {"k": "test key" }my_index:索引名 _doc:文档类型&#…

大数据hadoop生态技术简介

Hadoop 生态是指围绕 Hadoop 大数据处理平台形成的一系列开源软件和工具,用于支持大规模数据处理、存储、管理、分析和可视化等应用场景。暂时将其核心技术分为9类: 数据采集技术框架: Flume、Logstash、FileBeat;Sqoop和Datax&…

防雷抗浪涌插排插座推荐,同为科技(TOWE)防雷桌面PDU安全可靠

同为科技TOWE双排防雷抗浪涌桌面PDU插座 随着夏天天气越来越热,强对流天气增多,雷雨天气频发。在雷电季节,通常影响家用电器安全的主要原因是由于雷电感应的侵入,特别是对绝缘强度低、过电压耐受力差的微电子产品影响甚大。而所谓…

新手Maven入门(一)

Mavenue介绍和基本概念 一、什么是Maven1.1 Maven的组成1.2 安装和配置Maven1.2.1 下载1.2.2 安装 二、Maven 的基本概念2.1 标准的目录结构2.2 POM 大纲2.2.1 pom大纲展示 2.3 构件2.3.1 什么是maven的构建 2.4 POM 文件的用例2.5 GAV 坐标 三、依赖 一、什么是Maven Maven 是…

DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到,要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时,提到要把减污降碳协同增效作为促…

el-element-admin实现双路由菜单

需求: 1、输入用户名登录企业级菜单 2、点击企业级菜单中的首页,右边显示项目列表,点击某一行跳转到项目级菜单 注意: 企业级菜单和项目级菜单,后端分别给接口 具体实施: 1、点击面包靴首页的时候设置标记…

关于nginx,正向代理和反向代理是什么意思

为什么要使用nginx 很多公司会用到nginx做代理服务器,为什么用nginx,tomcat服务器不行吗? tomcat缺点:并发量小,用户使用的少 nginx:高并发,高性能,cpu、内存等资源消耗却非常低&…

06-揭开神秘面纱:Golang method的魅力解析

📃个人主页:个人主页 🔥系列专栏:Golang基础 💬Go(又称Golang)是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性,拥有高效的并发编程能力和简洁的语法。G…