注:这篇文章应该是根据某个博客记录下来的,但记不得链接了,请原作者见谅。

IBinder、BBinder和BpBinder 这3个类,是对Android Binder框架的抽象,其实这个BBinder,改成BnBinder可能更形象一些。
但是要注意的是,一个IXXXService的继承图中,BpBinder并不在这个继承关系之中,也就是说BpBinder并没有子类。但是BBinder是在这个继承关系当中的,它的子类就是BnInterface。
换句话说,BBinder和BpBinder的功能并不是对称的,以前就是没有理解到这一点,才会一直很糊涂。

BpBinder的是存在于BpRefBase中的mRemote的成员变量中。从Client调用Service的过程中分析,就更清楚了。
假设有一个IXXXService接口:

class IXXXService : public IInterface {....public void helloWorld(const char* str);....
}

(1)client调用service
client得到一个BpXXXService以后
(a)会调用BpXXXService实现的helloWorld,它会将str参数打包到Parcel中。然后调用remote()->transact(xxx)
(b)remote()是在BpXXXService的父类BpRefBase中实现的,返回的就是一个BpBinder.实际上调用的就是BpBinder的transact
(c)BpBinder的transact实现,就是直接调用IPCThreadState::self()->transact()发送数据。

(2)service接收client请求:
(a)通过IPCThreadState接收到client的请求后,首先会调用BBinder的transact方法。
(b)BBinder的transact方法又会调用子类实现的虚拟方法onTransact。这个虚拟方法是在BnXXXService中实现的。
(c)onTransact方法,会通过传递进来的参数来判断,需要调用IXXXService中的那个方法,示例中只有一个helloWorld方法。
(d)直接调用helloWorld,就会找到它的真正实现,也就是BnXXXService的子类XXXService中的helloWorld方法。
总结一下,从上面的流程当中就可以看出前文说的,BpBinder并不在继承关系当中,它只是一个打包数据,并通过IPCThreadState::self()->transact()方法发送出去。
而BBinder和BnXXXService的作用,就是接收IPCThreadState传递过来的信息,解包数据,并调用XXXService真正的实现。

IPC的数据处理,Binder Driver和ServiceManager学习后会继续分析总结。

参考链接

  • Android Binder机制原理

IBinder、BBinder和BpBinder相关推荐

  1. IBinder, BBinder和BpBinder

    这3个类,是对Android Binder框架的抽象,其实这个BBinder,改成BnBinder可能更形象一些. 但是要注意的是,一个IXXXService的继承图中,BpBinder并不在这个继承 ...

  2. Android Binder机制(1501210451 张志康)

    本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...

  3. Android binder学习一:主要概念

    为什么80%的码农都做不了架构师?>>>    要看得懂android代码,首先要了解binder机制.binder机制也是android里面比较难以理解的一块,这里记录一下bind ...

  4. IBinder对象在进程间传递的形式(二)

    这篇文章是对IBinder对象在进程间传递的形式(一)这篇文章的补充,首先还是把service启动过程的流程图贴上来 Android中主要通过2种方法来获得service IBinder: 1.    ...

  5. Binder 驱动详解(下)

    前言 通过 Binder 上一篇文章的分析, 我们知道了 Binder 驱动在我们应用开发过程中的使用方式, 了解到了 BBinder 和 BpBinder 两个非常重要的 Native 对象, 本次 ...

  6. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  7. Binder源码分析之Native层(原)

    前面两节中介绍了Binder机制中的 ServiceManager 和 Binder驱动 ,在这一节中,我们来介绍Native中的Binder通讯. 为了更好的理解过程,我们挑选Native中的Med ...

  8. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

  9. Android Binder基本概念流程学习

    一 Media Service进程启动 Init.rc中描述的service对应linux 的进程: Media进程定义: service media /system/bin/mediaserverc ...

最新文章

  1. Stay hungry, Stay foolish---致所有迷茫的人
  2. 看人装X,我就来气,开启极限装X模式
  3. 关于ASP.NET 中站点地图sitemap 的使用
  4. 最小生成树(削减某条边后该边能否构成最小生成树的成分)
  5. HTML5锚点请用id代替name
  6. mysql5.7.20 sql mode_MySQL5.7中的sql_mode默认值带来的坑及解决方法
  7. 批处理之for用法大全
  8. photoshop2022更新,新版PS新增了哪些功能Mac/win
  9. 用Java实现两个Excel表格中数据的对比
  10. js layui 模板属性 添加_layui模板引擎如何使用 - layim
  11. 海洋cms播放器html,海洋cms升级新播放器后播放不了如何解决?
  12. 从自己的角度比较 天书夜读 和 寒江独钓
  13. 【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序
  14. Codeforces 743 D Chloe and pleasant prizes
  15. Google天气和股票API
  16. 二叉树的遍历之先序遍历、中序遍历和后序遍历
  17. MEM/MBA数学强化(04)方程 函数 不等式
  18. CAD中 OLE不能旋转_CAD制图初学入门教程:阵列功能的使用技巧
  19. bzoj1503 郁闷的出纳员
  20. 华为od机试真题 JS 实现【热点网站统计】

热门文章

  1. Java SE 16新版本特性(中文注释说明)
  2. PHP实现文件上传和下载超完整实例源码(详解)
  3. bootstrap网格设置等高度
  4. 华中科技大学计算机科学与技术课程,华中科技大学计算机科学与技术专业本科人才培养方案[实用].pdf...
  5. a370m和2050差距 a370m和rtx 2050参数对比
  6. LeetCode(多线程)- 1279. 红绿灯路口
  7. 青软实训 Oracle实训完整代码
  8. 从题目分析中获得了一些对SOA的新理解
  9. docker公共仓库:创建docker hub公共仓库 / 登陆docker hub仓库报错解决/ 上传拉取镜像 / 配置阿里云镜像加速器
  10. a+1、a+1、*(a+1)、*(a+1)、*(*(a+1))的区别