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

 现在要搞明白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.hqwc.cn/news/83595.html

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

相关文章

“石头剪刀布”游戏:while、函数自调用实现循环游戏

if…else实现“石头剪刀布”游戏,while、函数自调用实现循环游戏。 (本笔记适合学过if…else的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&#xff0c…

React Diff算法

文章目录 React Diff算法一、它的作用是什么?二、React的Diff算法1.了解一下什么是调和?2.react的diff算法3.React Diff的三大策略4.tree diff:1、如果DOM节点出现了跨层级操作,Diff会怎么办? 5. component diff:6. e…

Windows平台Unity下播放RTSP或RTMP如何开启硬解码?

我们在做Windows平台Unity播放RTMP或RTSP的时候,遇到这样的问题,比如展会、安防监控等场景下,需要同时播放多路RTMP或RTSP流,这样对设备性能,提出来更高的要求。 虽然我们软解码,已经做的资源占有非常低了…

mysql 默认的4个数据库 介绍

mysql 存储MySQL的用户账号和权限信息,一些存储过程、事件的定义信息 一些运行过程中产生的日志信息,一些帮助信息以及时区信息等 information_schema 存储Mysql服务器 维护的所有其它数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪…

基于YOLOv8模型和DarkFace数据集的黑夜人脸检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型和DarkFace数据集的黑夜人脸检测系统可用于日常生活中检测与定位黑夜下的人脸,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目…

【IO进程线程】使用标准IO函数完成用户的登录和注册

1 实现登录功能 自定义一个usr.txt,先手动输入其账户密码。 格式:账户 密码 例: zhangsan 12345 lisi abcde wangwu abc123 需求如下: 1. 从终端获取账户密码,与文件中的账户密码比较; 2. 若终端输入的账户…

把Android手机变成电脑摄像头

一、使用 DroidCam 使用 DroidCam,你可以将手机作为电脑摄像头和麦克风。一则省钱,二则可以在紧急情况下使用,比如要在电脑端参加一个紧急会议,但电脑却没有摄像头和麦克风。 DroidCam 的安卓端分为免费的 DroidCam 版和收费的 …

设计模式之抽象工厂

文章目录 一、介绍二、基本组件三、演示案例1. 定义抽象工厂2. 定义抽象产品3. 定义具体工厂4. 定义具体产品5. 代码演示6. 代码改造 四、总结 一、介绍 抽象工厂模式(Abstract Factory Pattern)属于创建型设计模式。用于解决比工厂方法设计模式更加复杂的问题。 复杂到哪里了…

iOS 分别对一张图的局部进行磨砂,拼接起来不能贴合

效果图 需求,由于视图层级的原因,需要对图片分开进行磨砂, 然后组合在一起 如图,上下两部分,上下两个UIImageVIew大小相同,都是和图片同样的大小,只是上面的UIimageVIew 只展示上半部份 &#…

SQL 错误 [22007]: ERROR: invalid input syntax for type date: ““

0. 背景 PG数据库一张表有这样一个varchar类型的字段end_date,存储的值是格式化后的年月日日期如 2024-08-10 现在我需要根据当前日期与end_date的差值作为where条件过滤,我的写法 select …… from my_table_name where current_date - cast (end_date as date) >100报错…

【深度学习】实验02 鸢尾花数据集分析

文章目录 鸢尾花数据集分析决策树K-means 鸢尾花数据集分析 决策树 # 导入机器学习相关库 from sklearn import datasets from sklearn import treeimport matplotlib.pyplot as plt import numpy as np# Iris数据集是常用的分类实验数据集, # 由Fisher, 1936收集…

2023年高教社杯 国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 描述 …