Android Camera中的aidl与binder (二)- mRemote对象拾遗
在回顾上篇文章的时候,我注意到:Binder和BinderProxy两个类都实现了transact,它们也都是IBinder的实现类
那么mRemote调用的transact究竟是哪个类的方法?
并且我们都知道CameraService并没有Stub类的实例,也就是说其java接口是没有实现的,如果如上篇文章所述,调用尽头将会是一个没有实现的接口
所以我们要重新探究mRemote.transact的调用过程
回到CameraManager:
通过上一篇文章的分析我们已经知道,第二个框中的asInterface传入的参数cameraServiceBinder最终会传到ICameraService.Stub.Proxy中,在Proxy的构造函数中将值赋给mRemote
既然mRemote的类型最终是由cameraServiceBinder这个对象决定,那么其类型就是我们要关注的重点,显然我们要回到CameraManager第一个框,看看cameraServiceBinder的前世今生:
不难看出cameraServiceBinder来自ServiceManager.getService,那么我们去看看:
\frameworks\base\core\java\android\os\ServiceManager.java
cache里有就取出来,没有的话就通过rawGetService获得
函数很大,但是通过返回值判断看上去有用的就框中一个调用
看上去和我们熟悉的binder调用很像,看ServiceManagerNative之前,先看一下参数,来自
BinderInternal.getContextObject()
\frameworks\base\core\java\com\android\internal\os\BinderInternal.java
没想到!居然是一个native方法
openGrok之,找到这个native方法的定义位置:
\frameworks\base\core\jni\android_util_Binder.cpp
接下来跟一下这个android_os_BinderInternal_getContextObject方法的实现
这里看到创建了一个native层IBinder类型的对象b,进去看一下b的详细赋值过程
\frameworks\native\libs\binder\ProcessState.cpp
285行可以看出,返回的b是BpBinder创建出来的对象,Native的binder类我们之后再探索,先知道这个类型即可,回到
现在我们知道b是个BpBinder类,接下来把这个BpBinder传入javaObjectForIBinder中处理
框里应该是一个JNI调用,参数分别是对应的java类,java方法和传入的参数
那么去找gBinderProxyOffsets这个结构体的赋值
1403行开始的一系列赋值行为说明了gBinderProxyOffsets这个结构体对应的就是BinderProxy这个类,那么上一步的CallStaticObjectMethod调用实际上就是Binder.java其内部类BinderProxy的getInstance方法!真够复杂的
去确认一下,方法名和参数都可以对得上
于是我们需要狠狠地回顾一下,1067行这个new出来的BinderProxy对象最后返回到哪里去了呢
想必有些彭友已经懵了,我也懵了,所以我整理了目前至此的流程:
这下我们可以看到,BinderProxy对象一路返回到了ServiceManager.java的getIServiceManager方法,并作为参数传进了ServiceManagerNative.asInterface中:
\frameworks\base\core\java\android\os\ServiceManager.java
至此,ServiceManagerNative.asInterface的参数来历解释清楚了,接下去看asInterface
\frameworks\base\core\java\android\os\ServiceManagerNative.java
如上图,传入的这个obj就是上述过程中新建的BinderProxy对象
和上一篇分析类似,在跨进程的情况下,asInterface最终会返回一个Proxy对象
这里是ServiceManagerProxy的构造方法,于是就将BinderProxy类型的对象传给mRemote了
回去看一下流程图,至此我们知道了rawGetService中调用的getIserviceManager实际上返回的sServiceManager对象类型是ServiceManagerProxy,其内部的mRemote是BinderProxy类型
再往回看一层:
因为getIServiceManager返回的对象是ServiceManagerProxy类型
这下我们就知道了253行调用的getService是ServiceManagerProxy中的方法,
于是去看一下ServiceManagerProxy中getService的实现:
还是通过返回值找值得关注的调用,126行可以看到,getService的返回值binder是通过一个Parcel类的对象reply调用readStrongBinder来获得:
\frameworks\base\core\java\android\os\Parcel.java
这里又要调用native方法了
对应关系在:
\frameworks\base\core\jni\android_os_Parcel.cpp
455行的javaObjectForIBinder方法在之前有解释过,第二个参数接受一个BpBinder对象,且这个方法返回一个BinderProxy对象,如果忘记了可以回到这里回顾
说了这么深,我们到底探究到了哪一步?我帮你整理好了这个BinderProxy对象的返回路径:
这样一路回到了CameraManager中,我们大致走完了ServiceManager.getService的整个流程:
并且知道了cameraServiceBinder这个对象是BinderProxy类型的
那么,传入asInterface,并最终为Proxy对象赋值的参数也就是BinderProxy类型
那那么,上一篇文章的说法就需要修改一下,此时mRemote.transact调用的不再是Binder类的transact,而应该是BinderProxy类的transact
参考:
https://www.jianshu.com/p/72bc48d59f0e
Android Camera中的aidl与binder (二)- mRemote对象拾遗相关推荐
- android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...
本文首发于微信公众号「后厂技术官」 在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messeng ...
- android studio中使用AIDL进行客户端与服务端互相通信
前言 在AIDL实现IPC通信,调用远程服务端的方法.但是,远程服务端并不能主动给客户端返回信息.在很多情况下是需要远程服务端主动给客户端返回数据,客户端只需要进行监听即可,这是典型的观察者模式.这篇 ...
- Android应用中通过AIDL机制实现进程间的通讯实例
Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达 ...
- android lcd 显示图片,Android开发中通过AIDL文件中的方法打开钱箱,显示LCD屏幕
下载相关 资源文件 ,在项目中新建如下层级的文件夹,将源文件中的AIDL文件放入其中. ICallback:打印服务执行结果的回调 ITax:打印服务执行结果的回调 ILcdCallback:顾显反馈 ...
- Android P中的AVB校验(二)
上一篇是大概知道了Android P中的AVB校验流程,其中我们说了目的就是为了挂载,那么怎么挂载呢?这一篇一起来学习一下前辈的文章:https://blog.csdn.net/rikeyone/ar ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...
- IPC中的AIDL机制(二)
在了解了AIDL的流程及基本原理之后,我们还需要对AIDL有进一步的了解. 在上一篇的例子的基础之上,我们考虑另一种情况: 假设有一种需求:用户不想时不时地去查询图书列表了,太累了,于是,他去问图书馆 ...
- 在Android工程中加入AIDL文件时,gen目录生成的文件报错-问题解决
from://http://blog.csdn.net/watt520/article/details/10099047 今天在弄清除缓存的东东,按照网上别人的方法,创建了一个AIDL文件,这个时候发 ...
- android Camera 中的相关概念
相机"调焦"与"对焦"的区别 相机的镜头都是有多片透镜组成的,可以等效为一个凸透镜.假设某一个时刻,该透镜的焦距(对平行光聚焦的焦距)是f. "调焦& ...
最新文章
- 读书笔记(2) OpenLayers中的图层
- RESTful之认证Authentication
- sql 日期和当前日期时间差_如何通过excel获取当前的日期和时间
- 为网格布局图片打造的超炫 CSS 加载动画
- 快速配置Ehcache
- 请使用复选框选择_使用可选是可选的
- WEB在线预览PDF
- 飞鸽传书 2010Beta2.0正式版预计本月内即可上线
- 移动端分享到微信和QQ
- 明略数据是谁?为何能拿下腾讯在行业AI的高额投资
- Excel文件解密软件
- 计算机科学与技术的职业资格,软件水平考试是专业技术资格还是职业资格
- 高等数学:第一章 函数与极限(6)极限存在准则、两个重要极限
- 我看肖老师的《明日世界-云端计算下的程序设计需求》视频时,做的简单笔记
- Java面试快问快答-Instrument机制
- 转载:Transferring Login Credentials Securely
- Ubuntu中运行unity
- 单位强制解除与员工的劳动关系怎么办
- xmap 配置php环境,xmap 的动态 - SegmentFault 思否
- Java面试手写编程题(面试官经常让人手写)