以下概述Binder通信过程中涉及到的四个对象:Binder本地对象、Binder实体对象、Binder引用对象、Binder代理对象的生死。

1、Binder通信的交互过程

  1.Client 进程发出进程间通信请求,具体由Client进程中的代理对象通过Binder驱动程序向Server进程中的Binder本地对象发起请求。

  2.Binder驱动程序根据Client进程传递过来的Binder代理对象的句柄值找到Binder驱动程序内的Binder引用对象。

  3.根据Binder引用对象找到Binder实体对象。同时为本次请求创建一个binder_transaction结构(事务)来描述本次进程间通信过程。

  4.Binder驱动程序根据找到的Binder实体对象找到运行在Server进程中的Binder本地对象,并将Client进程发来的数据发给他。

  5.Server进程处理完成后,将处理结果返回给Binder驱动程序,驱动程序将结果写入前面创建的binder_transaction中

  6.Binder驱动程序通过保存在binder_transaction中的Client信息,找到Client进程,将通信结果返回给对应的Binder代理对象处理。

2、由以上过程可知:binder代理对象依赖于binder引用对象,binder引用对象依赖于binder实体对象,binder实体对象依赖于binder本地对象。一下介绍这些被依赖的对象是如何保证粗活的:

binder 引用对象和binder实体对象在内核空间Binder驱动程序内部维护。实际上分别是binder_ref和binder_node结构体。

binder 代理对象在用户空间Client进程内维护。是一个BpBinder对象。

binder 本地对象在用户空间Server进程内维护。是一个BBinder对象。

  1.Binder本地对象的生命周期。

    在被驱动程序实体对象引用时,应该保证本地对象的引用计数不为0。在Server进程将一个Binder本地对象注册到ServerManager时,Binder驱动程序会为他创建对应的实体对象(binder_node)。当有Cient进程查询Binder本地对象的代理对象接口时,binder_node 中的有关引用计数的值会发生改变。Binder驱动通过函数:

  binder_thread_read

  使用协议BR_INCREFS,BR_ACQUIRE,BR_DECREFS,BR_RELEASE与Server进程通信。通信数据会写入Server进程的一个用户空间缓冲区中。

  Server进程的IPCThreadState的成员函数executeCommand从取出协议命令并执行,增减本地对象的强弱引用计数实现生命周期管理。

  另:BBinder继承自RefBase,在用户空间的引用可自动管理。

  2.Binder实体对象的生命周期。

  当Binder引用对象创建或销毁时,由于引用对象会引用实体对象,需要对应的增减Binder实体对象的引用计数。因为同在内核空间,调用binder_inc_node和binder_dec_node操作实体对象的引用,具体规则参考源码binder.c的这两个函数实现。

  3.Binder引用对象的生命周期。

  类似本地对象的生命周期,在Binder驱动程序内使用函数binder_thread_write,读取由Client写入用户空间缓冲区的BC_ACQUIRE,BC_INCREFS,BC_RELEASE,BC_DECREFS四个协议增减Binder引用对象的强弱引用计数。

  这个过程是通过Client进程传进来的句柄值找到对应的引用对象的。

  4.Binder代理对象的生命周期。

3.Binder对象死亡通知机制:

  过程一:

  1.定义死亡接收通知,DeathRecipient

  2.调用代理对象BpBinder的linkToDeath注册。注册的最后会调用IPCThreadState::flushCommands()将注册死亡通知协议尽快通知给Binder驱动程序

  3.Binder驱动程序在binder_thread_write中处理注册请求。

  过程二:

  1.发送死亡通知:本地对象死亡会出发关闭/dev/binder设备,binder_release会被调用,binder驱动程序会在其中检查Binder本地对象是否死亡,该过程会调用binder_deferred_release 执行。如死亡会在binder_thread_read中检测到BINDER_WORK_DEAD_BINDER的工作项。就会发出死亡通知。

  2.接收死亡通知:Client进程会在IPCThreadState::executeCommand函数中处理到BR_DEAD_BINDER协议了。

  过程三:

  1.注销接收死亡通知:代理对象调用BpBinder::unlinkToDeath。

  

最新文章

  1. ASP.NET Core 中文文档 第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API
  2. 二.持续集成之--WEB后台
  3. Matlab中的一些小技巧
  4. qt5.4.0在windows,32位下的编译, vs2010平台
  5. SSAS CUBE TEST CASES
  6. 用Maven插件生成Mybatis代码/数据库
  7. backbone case
  8. inner join on, left join on, right join on
  9. 九度OJ 1035:找出直系亲属(二叉树)
  10. docker 安装 zookeeper
  11. java 判断null和空
  12. Leetcode 344. 反转字符串
  13. iOS 如果页面 A 跳转到 页面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪个先调用?
  14. Python开发——解释器安装
  15. hotplug 热拔插机制框架
  16. 深入理解ajax系列第六篇——头部信息
  17. [转]解决阿里云mysql不能连接,配置mysql远程连接
  18. 关于CSRF跨域请求伪造的解决办法
  19. elasticsearch -- 问题纪录
  20. CentOS 7 安装Nginx 并配置自动启动

热门文章

  1. LeetCode H2O 生成
  2. 在cnetos7上搭建mysql主从服务
  3. SpringBoot 项目运行在 tomcat7 上
  4. vue 无限滚动问题
  5. 复杂的POI导出Excel表格(多行表头、合并单元格)
  6. zhy2_rehat6_mysql03 - MHA_搭建.txt
  7. 使用python执行系统命令——subprocess
  8. kubernets学习笔记
  9. 【RTOS】为H7配套的uCOS-III模板也是可以用于MDK AC6的,提供个模板
  10. Linux中fuser命令用法详解