以下概述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。

  

android binder 进程间通信机制3-Binder 对象生死的更多相关文章

  1. android binder 进程间通信机制2 - Binder进程间通信库实现原理

    1.Service组件 使用模板类BnInterface描述,称为Binder本地对象,对应于Binder驱动程序中的Binder实体对象 实现原理图如下:

  2. android binder 进程间通信机制1-binder 驱动程序

    以下内容只大概列个提纲,若要明白其中细节,还请看源码: 申明:本人菜鸟,希望得到大神指点一二,余心足已 binder 设备:/dev/binder binder 进程间通信涉及的四个角色: Clien ...

  3. [置顶] 深入理解android之IPC机制与Binder框架

    [android之IPC机制与Binder框架] [Binder框架.Parcel.Proxy-Stub以及AIDL] Abstract [每个平台都会有自己一套跨进程的IPC机制,让不同进程里的两个 ...

  4. android binder 进程间通信机制5-Service注册和代理对象的获取

    ServiceManager,其实也是一个Service,不过它的Server端实现并未使用Binder库的结构实现,而是直接打开binder/dev进行通信的,不具有普遍性. 下面以MediaSer ...

  5. android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口

    Binder间进程通信的JAVA层接口,主要是通过JNI方法来调用Binder库的C/C++接口 在JAVA层,将Service组件称为JAVA服务,Service组件的代理称为JAVA服务代理. 一 ...

  6. android binder 进程间通信机制4-Service Manager

    Service Manager 是Binder进程间通信的核心组件之一: 它扮演者Binder进程间通信上下文(Context Manager)的角色 负责管理系统中的Service组件 向Clien ...

  7. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  8. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

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

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...

随机推荐

  1. 使用kubernetes的cronjob定时备份mysql数据库

    1.创建cronjob的文件 CronJob所描述的,正是定时任务. 在给定时间点只运行一次 在给定时间点周期性地运行 一个 CronJob 对象类似于 crontab (cron table)文件中 ...

  2. [转载] redis学习入门 Redis 3.2.100

    参考博客: https://blog.csdn.net/flyer_tang/article/details/80320974 https://blog.csdn.net/weixin_3077313 ...

  3. .NET种Json时对单引号和特殊字符串的处理

    转自:https://www.cnblogs.com/ITniao/archive/2011/01/06/1929261.html .NET种Json时对单引号和特殊字符串的处理   在Asp.NET ...

  4. leaflet-webpack 入门开发系列五地图卷帘(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  5. iOS中UICollectionView添加头视图

    参考链接:https://www.jianshu.com/p/ef57199bf34a 找了一堆的博客,写的都少了很重要的一步. //引入头部视图 -(UICollectionReusableView ...

  6. (办公)记事本_Linux常用的目录命令

    参考尚硅谷的谷粒学院:http://www.gulixueyuan.com/course/300/task/7078/show#(免费看,课程很全面,用手机登录一下就行.) .[root@localh ...

  7. div块水平居中,垂直居中

    水平居中一个div想要水平居中于它的父div中只需要给它加css属性margin:0 auto; 即可 <!DOCTYPE html> <html> <head> ...

  8. 一天两道pat(3)1007,1008

    1007没什么好说的,就是注意暴力求素数的时候,循环到(根号n)+1就好: 重点说说1008,不用新开一个数组就实现循环移位的操作 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下 ...

  9. ES6 ES7 ES8 相关用法

    set Set作为ES6新的数据解构(类数组),它的成员都是唯一的,因为最直接的使用场景便是去重.并.差.交集的使用.它使用的算法叫做“Same-value-zero equality”,类似精确运算 ...

  10. linux下录屏和回放工具script和scriptreplay

    读书是一个长见识的过程,以前偶尔会用到录屏的工具,很少用想系统的学习一下.最近看了linux shell脚本攻略,发现很多新东西是以前自己没有接触到的.比如,这个非常好用的录屏工具:script,这次 ...