APP Binder客户端调用全流程分析

news2024/9/24 9:26:59

 现在要搞明白JAVA层app调用跨进程的Service接口时,它的binder是怎样从Java->jni-->native--->binder驱动的这条链路:就是上图中的左半部分从上至下的流程。所以切入点在于,如app调用另一个进程的Service接口的getString()进行分析,如下:

myService.getString(); //调用服务接口
    -->进入aidl的getString():即IMyAidlInterface.Stub.Proxy.getString()
      -->mRemote.transact();
        -->IBinder.java->transact();
          -->BinderProxy.java->transact(); //还有一个是Binder.java那个是服务端的,所以这边要看BinderProxy客户端这边
            -->transactNative(code, data, reply, flags); //感觉到头了没路了,进入了JNI层(Zygote启动->JNI的注册,在那里面)

先来看看ZygoteInit.java做什么事。
app_main.cpp: //启动zygote
  -->runtime.start("...ZygoteInit", args,zygote);  
       -->startReg() //注册JNI
         -->register_jni_procs(gRegJNI,...); //注册了很多jNI接口  
         来看看gRegJNI[]={
             ...
             REG_JNI(register_android_os_Binder), //在这边注册,就是前面的
               -->android_util_Binder.cpp->int_register_android_os_BinderProxy():
                 -->gBinderProxyMethods[]={
                     //对应上面的transactNative的本地接口。
                     {"transactNaive", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z",(void*)android_os_BinderProxy_transact} 
                 }
             ...
         }        
 所以,前面调用到transactNative之后,就进入到JNI层的android_util_Binder.cpp中的
 android_os_BinderProxy_transact(.., jObject obj)处理。 
   -->这个obj是Binder Proxy.
      //将java的数据转成C++层的对象
      Parcel* data = parcelForJavaObject(env, dataObj);
      Parcel* reply = parcelForJavaObject(env, replyObj);

      //重要:调用getBPNativeData函数获得BinderProxy在Native中对应的BinderProxyNativeData
      //target本质上就是Native的BpBinder.
      IBinder *target = getBPNativeData(env, obj)->mObject.get();
        //下面这个语句就是反射。
        -->return (BinderProxyNativeData*)env->GetLongField(obj, gBinderProxyOffset.mNative);
      target->transact(code, *data, replay, flags);//这个直接进入了BpBinder.cpp的代码
即:   BpBinder.cpp->transact()
        //进入调用下面:创建并维持一个线程单例并调用transact接口
        -->IPCThreadState::self()->transact(mHandle, code, data, reply, flags);
          -->IPCThreadState.cpp->WaitForResponse();
              talkWithDriver();
                -->bwr.write_buffer = mOut.data();//设置缓存
                   ioctl(FD, BINDER_WRITE_READ, &bwr); //读写驱动
                   
              -->case BR_REPLY:
                 -->mIn.Read();
         

上面就是整体的调用流程,非常的清晰明了。

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

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

相关文章

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一,spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成,以实现更便捷的开发和管理。在集成过程中,Spring 提供了许多特性和功能,如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

安全学习DAY19_小程序信息打点

信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构 文章目录 信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构本节知识&思维导图本节使用到的链接&工具 小程序获取-各大平台&关键字搜索小程序-模版测试上线&源码…

如何开启esxi主机的ssh远程连接

环境:esxi主机,说明:esxi主机默认ssh是不开启的,需要人工手动启动,也可以设置同esxi主机一起开机启动。 1、找到esxi主机,点击“配置”那里,再点击右边的属性,如图所示: …

java属性映射使用MapStruct的坑

目录 1.实体类和映射类只加注解Data 2.将Data换成getter和setter后build 3.那么此时我把getter和setter换成lombok的getter和setter 1.实体类和映射类只加注解Data 映射关系类 这个时候运行 提示源参数中不存在 注意这个文件夹 2.将Data换成getter和setter后build package c…

Python如何进行基本的数学运算

Python进行基本的数学运算 Python是一门功能强大且易于学习的编程语言,它不仅可以用于开发应用程序,还可以用于执行各种数学运算。让我们一起来看看如何在Python中进行基本的数学运算。 加法、减法、乘法和除法 Python支持常见的加法、减法、乘法和除…

[论文分享]Pedestrian attribute recognition based on attribute correlation

Pedestrian attribute recognition based on attribute correlation 行人属性识别广泛应用于行人跟踪和行人重识别。 两项最基本的挑战: 多标签性质数据样本的差异性特征,例如类别不平衡和部分遮挡。 不同方法的示意图: 此项工作中&#…

Linux操作系统--常用指令(用户管理操作类)

用户的管理需要使用超级管理员(root)来进行操作 (1).useradd添加新用户 功能:给当前的操作系统添加新的用户 语法: useradd 用户名 (2).passwd设置用户新密码 功能:给当前的用户设置密码 语法: passwd用户名 (3).i

核辐射对生物的影响

目录 1.什么是核辐射 2.核辐射的危害 3.核辐射对环境造成的影响 4.核辐射的影响会持续多长时间 1.什么是核辐射 核辐射是指自然界或人工产生的高能粒子或电磁波的放射性能量。当原子核不稳定时,会发生放射性衰变,释放出核辐射。 核辐射主要分为三种类…

市场的新宠:4G智能手表

现在人们提到智能手表,健康监测、运动记录、接打电话等定是他不可或缺的功能,而其中通讯功能在绝大数多的智能手表上都是通过蓝牙实现的,需要让手表通过蓝牙连接到手机端来进行。在没有手机的情况下,配置再高的蓝牙智能手表也是“…

深入浅出AXI协议(2)——通道及信号

一、前言 在之前的文章中,我们主要介绍了什么是AXI协议,AXI协议的特点与优点,然后对于AXI协议非常重要的五通道结构进行了介绍,了解了5个通道各自的作用。本文我们继续AXI协议的学习,我们将讨论5个通道的具体内容和相对…

判断网站是否开启CDN加速

方法一: 我们可以在CMD中ping一下想要测试的网站。比如baidu.com。 我们看到转向的还是baidu.com 接着用命令nslookup尝试下反向解析: 这种情况下一般是没有做CDN加速。 假设我们ping www.csdn.com: 我们看到它跳转到xxxx.com去了,这说明c…

Spring AOP 的实现及原理

目录 什么是 Spring AOP ?AOP 是啥 ?Spring AOP 可以干啥 ? AOP 的组成Spring AOP 的实现Spring AOP 的实现原理 什么是 Spring AOP ? AOP 是啥 ? 我们知道 OOP 是面向对象编程, 那 AOP 又是啥呢 ? AOP(Aspect Oriented Prog…

fastadmin后台表格新增tab选项卡不生效问题

官方一张图解析表格列表功能文档&#xff1a;(一张图解析FastAdmin中的表格列表的功能 - FastAdmin问答社区) 会遇到后期手动添加tab栏的情况 首先&#xff0c;需要在控制器对应的index.html页面中需要增加你想要筛选的字段 <div class"panel-heading">{:bui…

基于神经网络的3D地质模型

地球科学家需要对地质环境进行最佳估计才能进行模拟或评估。 除了地质背景之外&#xff0c;建立地质模型还需要一整套数学方法&#xff0c;如贝叶斯网络、协同克里金法、支持向量机、神经网络、随机模型&#xff0c;以在钻井日志或地球物理信息确实稀缺或不确定时定义哪些可能是…

leetcode 583. 两个字符串的删除操作

2023.8.26 本题看似很绕&#xff0c;其实就是 最长公共子序列 的变式。 求出最长公共子序列之后&#xff0c;再用两单词的总长度减去他们的最长公共子序列即可。 代码如下&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vec…

Java——单例设计模式

什么是设计模式&#xff1f; 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱、“套路”。 经典的设计模式共有23种。…

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVD奇异值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVD分解重构算法&#xff0c;MATLAB程序&#xff0c;奇异值分解 (Singular Value Decompo…

响应式web-PC端web与移动端web(H5)兼容适配 选型方案

背景 项目需要&#xff0c;公司已经有一套PC端web&#xff0c;需要做一套手机端浏览器可用的&#xff0c;但是又想兼容pc端&#xff0c;适配的web项目。 以下是查阅到响应布局现成的开源模版。根据自己技术栈&#xff0c;vue2,js来搜索相关的开源项目。 RuoYi 使用若依快速…

【C++进阶(一)】STL大法以及string的使用

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; STL标准库 1. 前言2. STL库的版本以及缺陷3. ST…