以下概述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. 「专题总结」LCT入门

    上次xuefeng说我的专题总结(初探插头dp)太不适合入门了,所以这次丢一些题解包以外的东西. 关键是我自己也不会...急需梳理一下思路... (让我口胡数据结构???顺便推广一下全世界最短的lct ...

  2. Mysql 的异常:The last packet successfully received from the server was 90 milliseconds ago. The last packet sent successfully to the server was 43,603,303 milliseconds ago. is longer than the server con

    调试一个程序, 调试到一半, 下班回家, 程序卡在了某一行, 第二天早上回来一看, 发现了异常: Wed Sep :: GMT+: WARN: Establishing SSL connection ...

  3. 从零开始手写 dubbo rpc 框架

    rpc rpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo. 主要用于个人学习,由渐入深,理解 rpc 的底层实现原理. 前言 工作至今,接触 rpc 框架已经有很长时间. ...

  4. WebShell代码分析溯源(八)

    WebShell代码分析溯源(八) 一.一句话变形马样本 <?php $e=$_REQUEST['e'];$arr= array('test', $_REQUEST['POST']);uasor ...

  5. WPF使用FlowDocument实现图文混排

    代码: <RichTextBox CaretBrush="#fff" Background="Transparent" BorderThickness=& ...

  6. LATEX Mathematical Symbols

    原文地址:https://www.caam.rice.edu/~heinken/latex/symbols.pdf

  7. Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  8. Effect:Mobile ocd

    Satisfy the following two Keep your phone at all times Check your phone even if there's no news Alwa ...

  9. Saltstack_使用指南09_远程执行-编写执行模块

    1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...

  10. 阿里云搭建wordpress博客教程

    一 :搭建环境 1.安装Apache环境 在线安装Apache yum install httpd 启动Apache服务 service httpd start 设置开机自启动 chkconfig h ...