在回顾上篇文章的时候,我注意到: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对象拾遗相关推荐

  1. android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...

    本文首发于微信公众号「后厂技术官」 在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messeng ...

  2. android studio中使用AIDL进行客户端与服务端互相通信

    前言 在AIDL实现IPC通信,调用远程服务端的方法.但是,远程服务端并不能主动给客户端返回信息.在很多情况下是需要远程服务端主动给客户端返回数据,客户端只需要进行监听即可,这是典型的观察者模式.这篇 ...

  3. Android应用中通过AIDL机制实现进程间的通讯实例

    Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达 ...

  4. android lcd 显示图片,Android开发中通过AIDL文件中的方法打开钱箱,显示LCD屏幕

    下载相关 资源文件 ,在项目中新建如下层级的文件夹,将源文件中的AIDL文件放入其中. ICallback:打印服务执行结果的回调 ITax:打印服务执行结果的回调 ILcdCallback:顾显反馈 ...

  5. Android P中的AVB校验(二)

    上一篇是大概知道了Android P中的AVB校验流程,其中我们说了目的就是为了挂载,那么怎么挂载呢?这一篇一起来学习一下前辈的文章:https://blog.csdn.net/rikeyone/ar ...

  6. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )

    文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...

  7. IPC中的AIDL机制(二)

    在了解了AIDL的流程及基本原理之后,我们还需要对AIDL有进一步的了解. 在上一篇的例子的基础之上,我们考虑另一种情况: 假设有一种需求:用户不想时不时地去查询图书列表了,太累了,于是,他去问图书馆 ...

  8. 在Android工程中加入AIDL文件时,gen目录生成的文件报错-问题解决

    from://http://blog.csdn.net/watt520/article/details/10099047 今天在弄清除缓存的东东,按照网上别人的方法,创建了一个AIDL文件,这个时候发 ...

  9. android Camera 中的相关概念

    相机"调焦"与"对焦"的区别 相机的镜头都是有多片透镜组成的,可以等效为一个凸透镜.假设某一个时刻,该透镜的焦距(对平行光聚焦的焦距)是f. "调焦& ...

最新文章

  1. 读书笔记(2) OpenLayers中的图层
  2. RESTful之认证Authentication
  3. sql 日期和当前日期时间差_如何通过excel获取当前的日期和时间
  4. 为网格布局图片打造的超炫 CSS 加载动画
  5. 快速配置Ehcache
  6. 请使用复选框选择_使用可选是可选的
  7. WEB在线预览PDF
  8. 飞鸽传书 2010Beta2.0正式版预计本月内即可上线
  9. 移动端分享到微信和QQ
  10. 明略数据是谁?为何能拿下腾讯在行业AI的高额投资
  11. Excel文件解密软件
  12. 计算机科学与技术的职业资格,软件水平考试是专业技术资格还是职业资格
  13. 高等数学:第一章 函数与极限(6)极限存在准则、两个重要极限
  14. 我看肖老师的《明日世界-云端计算下的程序设计需求》视频时,做的简单笔记
  15. Java面试快问快答-Instrument机制
  16. 转载:Transferring Login Credentials Securely
  17. Ubuntu中运行unity
  18. 单位强制解除与员工的劳动关系怎么办
  19. xmap 配置php环境,xmap 的动态 - SegmentFault 思否
  20. Java面试手写编程题(面试官经常让人手写)

热门文章

  1. 2.0.2-Reaper piano roll 缩放与滚动设置
  2. Python 输入一个整数,计算输入的各位数字的平方和
  3. 测试过程中为什么要做接口Mock测试,以及如何做
  4. CRUSH:可控、可扩展的复本数据非中心化的定位算法
  5. Release版本崩溃/闪退调试方法之一
  6. 测验2 PYTHON基本图形的绘制
  7. 北理工python程序设计学习笔记——(四)turtle八角图形绘制
  8. MCU低功耗系统设计笔记
  9. 域名解析文件异常如何解决?
  10. idea激活云服务器搭建