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

news2025/2/13 11:18:49

零、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.coloradmin.cn/o/645526.html

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

相关文章

看一图而思全云

>> 前言 << 我在看财经十一人吴俊宇老师撰写的《阿里云计划在12月内独立上市》时&#xff0c;看到了一张全球及中国IT支出结构图。就是下图这张图&#xff0c;盯着这张图&#xff0c;我看到了星辰大海&#xff0c;也想到了广阔天地大有可为。 但只看这个图不够过瘾…

1.7C++流插入运算符重载

C流插入运算符重载 在 C 中&#xff0c;流插入运算符&#xff08;<<&#xff09;用于输出数据到流中的运算符&#xff0c;流插入运算符可以被重载&#xff0c;使得程序员可以自定义输出对象的方式。 重载流插入运算符的一般形式如下&#xff1a; 其中&#xff0c;T 是…

Vue中如何进行瀑布流布局与图片加载优化

Vue中如何进行瀑布流布局与图片加载优化 瀑布流布局是一种常用的网页布局方式&#xff0c;它可以让页面看起来更加有趣和美观。在Vue.js中&#xff0c;我们可以使用第三方插件或者自己编写组件来实现瀑布流布局。同时&#xff0c;为了优化图片加载的性能&#xff0c;我们还可以…

部署minio分布式测试环境

准备了4台虚拟机作为minio分布式节点服务器。 操作系统为TencentOS3.1(相当于CentOS8) 选择从官网下载minio安装包,minio-20230602231726.0.0.x86_64.rpm 安装命令如下: rpm -ivh minio-20230602231726.0.0.x86_64.rpm 安装完毕,minio命令将会放在/usr/local/bin下。…

推动开源行业高质量发展|2023开放原子全球开源峰会圆满落幕

6 月 13 日&#xff0c;由 2023 全球数字经济大会组委会主办&#xff0c;开放原子开源基金会、北京市经济和信息化局、北京经济技术开发区管理委员会承办的 2023 开放原子全球开源峰会在北京顺利落下帷幕。本次峰会以“开源赋能&#xff0c;普惠未来”为主题&#xff0c;设置了…

多任务学习用于多模态生物数据分析

目前的生物技术可以同时测量来自同一细胞的多种模态数据&#xff08;例如RNA、DNA可及性和蛋白质&#xff09;。这需要结合不同的分析任务&#xff08;如多模态整合和跨模态分析&#xff09;来全面理解这些数据&#xff0c;推断基因调控如何驱动生物多样性。然而&#xff0c;目…

佩戴舒适的蓝牙耳机评测,值得入手的蓝牙耳机推荐

蓝牙耳机越来越少受年轻人的欢迎&#xff0c;蓝牙耳机品牌也非常多&#xff0c;很多朋友在选择时&#xff0c;不知道选哪款好&#xff0c;下面是小编整理的蓝牙耳机品牌排行榜前十名&#xff0c;大家可以参考参考。 一、南卡OE蓝牙耳机 参考价格&#xff1a;469 舒适性最高的…

4个维度搞懂Nacos注册中心

现如今市面上注册中心的轮子很多&#xff0c;我实际使用过的就有三款&#xff1a;Eureka、Gsched、Nacos&#xff0c;由于当前参与 Nacos 集群的维护和开发工作&#xff0c;期间也参与了 Nacos 社区的一些开发和 Bug Fix 工作&#xff0c;过程中对 Nacos 原理有了一定的积累&am…

专为AI大模型打造的GPU加速器MI300X

作者 I 刘博 54岁神秘女掌门&#xff1a;年薪4亿元&#xff0c;一代女强人 AMD与苏姿丰的名字如今深深绑定在一起。 1969年&#xff0c;苏姿丰出生在中国台湾&#xff1b;同一年&#xff0c;日后与她渊源颇深AMD在硅谷创立。谁也不会想到&#xff0c;她将在几十年后拯救AMD。 …

尚硅谷大数据技术Spark教程-笔记09【SparkStreaming(概念、入门、DStream入门、案例实操、总结)】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【SparkCore&#xff08;概述、快速上手、运行环境、运行架构&#xff09;】尚硅谷大数据技术Spark教程…

js执行顺序和promise.then()案例:

这篇笔记摘录来源&#xff1a; &#x1f449;我是javascript&#xff0c;2分钟彻底弄懂我的执行机制&#xff1f;【JavaScript教程】_哔哩哔哩_bilibili &#x1f449;js执行顺序_前端小白&#xff0c;请多指教的博客-CSDN博客 目录 面试题1&#xff1a; 面试题2: 面试…

java的转换流、压缩流、序列化流、打印流

一、转换流 转换流属于字符流&#xff0c;也是一种高级流&#xff0c;用来包装Reader和Writer。转化流是字符流和字节流之间的桥梁。转换输入流为InputStreamReader&#xff0c;把把字节流转化为字符流&#xff1b;转化输出流为OutputStreamWriter&#xff0c;把字符流转化为字…

解析 MySQL 锁机制:共享锁、排它锁、间隙锁、意向锁等,保障数据安全与高并发的秘密武器

前言并发事务问题锁分类锁定读共享锁排它锁 意向排它、意向共享锁自增锁记录锁间隙锁InnoDB 行锁模式及加锁方法死锁总结 前言 MySQL 锁机制比较显而易见&#xff0c;其最显著的特点是不同的存储引擎支持不同的锁机制 MySQL InnoDB 锁机制官方文档 比如在 MyISAM、Memory 存…

如何用Taro打造敏捷的移动App架构

什么是Taro&#xff1f; Taro&#xff08;或称为Taro框架&#xff09;是一种用于构建跨平台应用程序的开源JavaScript框架。它基于React和React Native&#xff0c;可以用于开发Web、iOS、Android和微信小程序等平台上的应用程序。 Taro的目标是实现一套代码多端运行的方案&a…

CRF条件随机场的原理、例子、公式推导和应用

转子&#xff1a;https://zhuanlan.zhihu.com/p/148813079 条件随机场&#xff08;Conditional Random Field&#xff0c;CRF&#xff09;是自然语言处理的基础模型&#xff0c;广泛应用于中文分词、命名实体识别、词性标注等标注场景。 条件随机场CRF与深度学习结合&#xf…

MATLAB文化算法

目录 文化算法 主要代码 Sphere AdjustCulture 结果 文化算法 基本概念&#xff1a;优化算法 | 详解文化算法&#xff08;附MATLAB代码&#xff09; - 知乎 不同于遗传算法只有种群进化空间&#xff0c;文化算法包含信念空间、种群空间两个进化空间&#xff0c;因此&#…

[学习笔记] [机器学习] 11. EM算法(极大似然估计、EM算法实例、极大似然估计取对数的原因)

视频链接数据集下载地址&#xff1a;无需下载 学习目标&#xff1a; 了解什么是 EM 算法知道极大似然估计知道 EM 算法实现流程 讲 EM 算法主要是为了后面的 HMM 做准备。 1. 初始 EM 算法 EM 算法&#xff08;Expectation-Maximization algorithm&#xff0c;期望最大化算法…

索引介绍和基本使用

介绍 索引就是用来加速SQL查询的 由于索引也是需要存储成索引文件的&#xff0c;因此对索引的使用也会涉及磁盘I/O操作。如果索引创建过多&#xff0c;使用不当&#xff0c;会造成SQL查询时&#xff0c;进行大量无用的磁盘I/O操作&#xff0c;降低了SQL的查询效率&#xff0c…

SaaS 系统完全开源介绍

&#x1f42f; 平台简介 芋道&#xff0c;以开发者为中心&#xff0c;打造中国第一流的快速开发平台&#xff0c;全部开源&#xff0c;个人与企业可 100% 免费使用。 架构图 管理后台的 Vue3 版本采用 vue-element-plus-admin &#xff0c;Vue2 版本采用 vue-element-admin 管…

MySQL数据库概念、管理以及SQL语句的基本命令操作

MySQL数据库概念、管理以及SQL语句的基本命令操作 一、数据库概念1、数据库的组成&#xff1a;数据、表、数据库2、数据库类型3、数据库的管理系统&#xff08;DBMS)4、数据库系统&#xff08;DBS&#xff09; 二、数据库系统发展史三、当今主流数据库四、关系型数据库五、MySQ…