ServiceManger Binder的处理流程

陌生知识点如下:

  • BinderProxy:是将Native层的BpBinder对象进行封装后传给Java层使用的Binder对象
  • android_util_binder: Binder在JNI层的相关注册,处理,转换封装接口
  • BpBinder:Binder驱动在Native层的封装。
  • IPCThreadState:线程池对象
  • ServiceManager: 就像互联网的DNS服务器(地址为0)

以APP调用ServiceManager为例进行分析,分析ServiceManger Binder的处理流程:
SM内存放着许多<string, Binder>的数组,可以通过getService(String name)获取到对应用Binder,这是键值对。

final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE); 
-->ServiceManager.java->getService():-->IBinder service = sCache.get(name)return servicerawGetService(name);-->final IBinder binder = getIServiceManager().getService(name);-->getIServiceManager()实现: //IServiceManager.aidl接口文件用于跨进程通信-->sServiceManager = ServiceManagerNative.asInterface(Binder.allowBlocking(BinderInternal.getContextObject()))-->asInterface(Ibinder obj):-->return new ServiceManagerProxy(obj); //返回一个Proxy的Binder对象。--》ServiceManagerProxy是一个类: class ServiceManagerProxy Implements IServiceManager{在它的构造函数中:public ServiceManagerProxy(IBinder remote){mRemote = remote;mServiceManager = IServiceManager.Stub.asInterface(remote); //转成Proxy对象}}//分析下面这个接口:这个是获取ServiceManager的IBinder,与其它Server的不同。-->BinderInternal.getContextObject():这个getContextObject接口的定义为:static final native IBinder getContextObject();//请进入Native看代码,返回的是BinderProxy对象(下面有说明)-->android_util_Binder.cpp->gBinderInternalMethods[]={{"getContextObject", "...", android_os_BinderInternal_getContextObject}; //映射到右边的Native接口...}android_os_BinderInternal_getContextObject: //返回的是BinderProxy对象。(下面有说明)-->sp<IBinder> b = ProcessState::self()->getContextObject(NULL);-->ProcessState:就是一个进程,每个进程启动时就会启动一个ProcessState.//位于ProcessState.cpp中:Zygote Fork()一个进程时就会创建ProcessState,//或者也可以这么理解,ProcessState就是进程在Native层的一个表示//主要管理Binder驱动的初始化,管理Binder交互的线程池等操作//Native层的getContextObject主要目的是为了构建获取Native层的IBinder对象(BPBinder)。//所有进程获取的IBinder对象在Native层都由它获取,Binder创建也由ProcessState创建。sp<IBinder> context = getStrongProxyForHandle(0);//上面这个语句参数0:要特别注意,0就像固定的IP地址,指的就是ServiceManage服务。//SM是ServiceManager<name, binder>中的第0个对象,因为SM也是一个进程,它就像互联网中的DNS服务器,//DNS服务器的地址是公开的,所以这边SM的handle为0,是固定的,是列表中的第0号Binder对象。-->b = BpBinder::create(handle) //这个handle = 0; //创建SM的BpBinder并保存下来,方便后面再查找。result = b;return result;//BpBinder是给java使用的,所以要封装成java能识别的数据结构。//需要进行数据的转换与处理:这些是JNI的知识点    //下面接口返回的是基于BpBinder对像封装出来的BinderProxy对象(JAVA用)return javaObjectForIBInder(env,b); //b就是SM在Native的BPBinder.//返回的是jobject对象,是反射参数的java的BinderProxy//使用到Java中的反射:运行了BinderProxy.java中的getInstance()方法-->  jobject object = env->CallStaticObjectMethod(gBinderProxyOffsets.mClass,gBinderProxyOffsets.mGetInstance, (jlong) nativeData, (jlong) val.get());-->BinderProxy.java中的getInstance()方法:-->result = new BinderProxy(nativeData); //构建了BinderProxy对象,这个是Java层的Binder代理return binder;

通过前面的代码分析,可以得到一个结论,ServiceManager的Binder封装过程如下图所示:其它所有服务端提供的Service的Binder的封装逻辑也是相同的逻辑,举一反三。

下面再以更加简洁的流程描述上这整个获取ServiceManager过程的调用逻辑:

ServiceManagerProxy(它是一个Stub.Proxy对象)-》 IServiceManager.Stub.Proxy.getService():-->mRemote.transact();-->BinderProxy.cpp->transact(); //从ServiceManagerProxy->到BinderProxy,这一层是framework层-->transactNative();-->进入android_util_binder.cpp->android_os_BinderProxy_transact(); //这一层是JNI层-->数据类型转换,因为 下面要传给Native层parcelForJavaObject();IBinder* target=getBPNativeData();target->transact(); //target就是BpBinder ,这个接口调用进入BpBinder.cpp,进入Native层-->IPCTrheadState.cpp:IPCThreadState::self()->transact(); //安排一个线程去处理binder的通信传输-->writeTransactionData(); //准备数据-->将数据写入结构体中,这里省略。mOut.write(cmd);mOut.write(&tr, sizeof(tr)); //只是将数据放到mOut这个Parcel对象中,但还未发送-->waitForResponse(); //这里是真正的发送数据的过程 。-->talkWithDriver();-->bwr.write_buffer = mOut.data() ; //取出out中的数据放到bwr中ioctl(FD, BINDER_WRITE_READ, &bwr); //真正的发送数据,写到驱动中。

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

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

相关文章

机器学习的测试和验证(Machine Learning 研习之五)

关于 Machine Learning 研习之三、四&#xff0c;可到秋码记录上浏览。 测试和验证 了解模型对新案例的推广效果的唯一方法是在新案例上进行实际尝试。 一种方法是将模型投入生产并监控其性能。 这很有效&#xff0c;但如果你的模型非常糟糕&#xff0c;你的用户会抱怨——这…

Sentinel 控制台(集群流控管理)

规则配置 要通过 Sentinel 控制台配置集群流控规则&#xff0c;需要对控制台进行改造。我们提供了相应的接口进行适配。 从 Sentinel 1.4.0 开始&#xff0c;我们抽取出了接口用于向远程配置中心推送规则以及拉取规则&#xff1a; DynamicRuleProvider<T>: 拉取规则Dy…

jvm开启远程调试功能;idea远程debug

概述 有时候一些问题本地调试无法复现&#xff0c;这个时候可以开启jvm的远程调试功能 jar包启动 jdk8 java -agentlib:jdwptransportdt_socket,address8787,servery,suspendn -jar xxx.jarjdk11/17 java -agentlib:jdwptransportdt_socket,address*:8787,servery,suspe…

关于ios Universal Links apple-app-site-association文件 Not Found的问题

1. 背景说明 1.1 Universal Links 是什么 Support Universal Links 里面有说到 Universal Links 是什么、注意点、以及如何配置的。简单来说就是 当您支持通用链接时&#xff0c;iOS 用户可以点击指向您网站的链接&#xff0c;并无缝重定向到您安装的应用程序 大白话就是说&am…

APP爬虫之-Protobuf协议逆向解析

在做APP抓取时&#xff0c;会发现有的APP Response回来的数据有“加密”。不知道返回的内容是什么。 如下&#xff1a; 如上&#xff0c;内容不是明文的&#xff0c;没办法解析数据。APP常见的对数据加密有三种情况&#xff1a;第一种是&#xff0c;用诸如AES这类加密算法对数…

R语言绘图相关函数(含实例)

目录 plot:可用于创建多种类型的图形 dev.new():新建画板 hist&#xff1a;绘制直方图 dotchart&#xff1a;绘制点图的函数 pie:绘制饼图 pair&#xff1a;绘制散点图矩阵 boxplot&#xff1a;绘制箱线图 scatterplot3D&#xff1a; 绘制三维散点图 par&#xff1a;修…

【动态规划】1137. 第 N 个泰波那契数

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 文章目录 0. 题目解析1.算法原理1.1 状态表示1.2 状态转移方程1.3初始化1.4 填表顺序1.5 返回值 2.算法代码 &#x1f427; 本篇是整个动态规划的…

【八股】2023秋招八股复习笔记4(MySQL Redis等)

文章目录 目录1、MySQLmysql索引实现mysql索引优化mysql索引失效的情况mysql 千万数据优化mysql 事务隔离级别 & 实现原理mysql MVCC版本链&#xff08;undo log&#xff09;mysql数据同步机制 & 主从复制 &#xff08;binlog&#xff09;mysql 日志&数据恢复&…

Springboot开发所遇问题(持续更新)

SpringBoot特征&#xff1a; 1. SpringBoot Starter&#xff1a;他将常用的依赖分组进行了整合&#xff0c;将其合并到一个依赖中&#xff0c;这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单&#xff0c;SpringBoot采用 JavaConfig的方式对Spring进行配置…

3D姿态相关的损失函数

loss_mpjpe: 计算预测3D关键点与真值之间的平均距离误差(MPJPE)。 loss_n_mpjpe: 计算去除尺度后预测3D关键点误差(N-MPJPE),评估结构误差。 loss_velocity: 计算3D关键点的速度/移动的误差,评估运动的平滑程度。 loss_limb_var: 计算肢体长度的方差,引导生成合理的肢体长度…

Redis通信协议

文章目录 Redis通信协议RESP协议数据类型 模拟Redis客户端 Redis通信协议 RESP协议 Redis是一个CS架构的软件&#xff0c;通信一般分为两步(不包含pipeline和PubSub)&#xff1a; 客户端(client)向服务端(server)发送一条命令。服务器解析并执行命令&#xff0c;返回响应结果…

Java面试题—2023年8月25日—PLKJ

2023年8月25日 北京 png ln kē j 答案仅供参考&#xff0c;博主仅记录发表&#xff0c;没有实际查询&#xff0c;不保证正确性。 面试题&#xff1a; 一.选择题 1.下面哪些是不合法的标识符 A.$persons B.TwoUsers C.*point D._endline 2. 下列语句执行后&#xff0c;k的值为…

Nginx 高级配置

目录 1 网页的状态页 2 Nginx 第三方模块 2.1 ehco 模块 3 变量 3.1 内置 3.2 定义变量 4 Nginx压缩功能 5 https 功能 6 自定义图标 1 网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http…

Mysql with as定义子查询

文章目录 1. 定义2. 适用场景3. 语法4. 示例 1. 定义 使用with as 可以让子查询重用相同的with查询块&#xff0c; 并在select查询块中直接引用&#xff0c; 一般用在select查询块会多次使用某个查询sql时&#xff0c; 会把这个sql语句放在with as 中&#xff0c; 作为公用的表…

基于PaddleOCR2.7.0发布WebRest服务测试案例

基于PaddleOCR2.7.0发布WebRest服务测试案例 #WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. #警告&#xff1a;这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。 输出结果…

我的128天创作纪念日-东离与糖宝

文章目录 机缘收获日常成就憧憬 不知不觉我也迎来了自己的128天创作纪念日&#xff0c;一起来看看我有什么想对大家说的吧 机缘 我的写博客之旅始于参加了代码随想录算法训练营。在训练营期间&#xff0c;代码随想录作者卡尔建议我们坚持每天写博客记录刷题学习的进度和心得体…

K8s学习笔记3

Kubernetes功能&#xff1a; Kubernetes是一个轻便的可扩展的开源平台&#xff0c;用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中&#xff0c;会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Goog…

stm32之USART(总结)

串行通信 UART串口内部结构示意图 普中科技的详细介绍 中断知识补充 代码 #ifndef __USART_H #define __USART_H #include "stdio.h" #include "stm32f10x_usart.h" #define USART1_REC_LEN 200 //定义最大接收字节数 200extern u8 USART1_RX_BUF[US…

飞天使-k8s基础组件分析-服务与ingress

文章目录 服务的介绍服务代理服务发现连接集群外服务服务发布无头服务 服务&#xff0c;pod和dns的关系端口转发通过expose 暴露应用服务案例INGRESSMetalLB使用参考文档 服务的介绍 服务的作用是啥&#xff1f; 提供外部调用&#xff0c;保证podip的真实性看看服务解决了什么…

淘宝商品数据采集(如何快速获取淘宝商品信息),淘宝API接口申请指南

淘宝作为国内的电商平台&#xff0c;拥有海量的商品信息。对于想要进行淘宝商品数据采集的人来说&#xff0c;如何快速获取淘宝商品信息是一个重要的问题。本文将介绍一些快速获取淘宝商品信息的方法。 1. 使用淘宝开放平台PI 淘宝开放平台提供了多种PI接口&#xff0c;可以通…