android binder 进程间通信机制3-Binder 对象生死
以下概述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 对象生死的更多相关文章
- android binder 进程间通信机制2 - Binder进程间通信库实现原理
1.Service组件 使用模板类BnInterface描述,称为Binder本地对象,对应于Binder驱动程序中的Binder实体对象 实现原理图如下:
- android binder 进程间通信机制1-binder 驱动程序
以下内容只大概列个提纲,若要明白其中细节,还请看源码: 申明:本人菜鸟,希望得到大神指点一二,余心足已 binder 设备:/dev/binder binder 进程间通信涉及的四个角色: Clien ...
- [置顶] 深入理解android之IPC机制与Binder框架
[android之IPC机制与Binder框架] [Binder框架.Parcel.Proxy-Stub以及AIDL] Abstract [每个平台都会有自己一套跨进程的IPC机制,让不同进程里的两个 ...
- android binder 进程间通信机制5-Service注册和代理对象的获取
ServiceManager,其实也是一个Service,不过它的Server端实现并未使用Binder库的结构实现,而是直接打开binder/dev进行通信的,不具有普遍性. 下面以MediaSer ...
- android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口
Binder间进程通信的JAVA层接口,主要是通过JNI方法来调用Binder库的C/C++接口 在JAVA层,将Service组件称为JAVA服务,Service组件的代理称为JAVA服务代理. 一 ...
- android binder 进程间通信机制4-Service Manager
Service Manager 是Binder进程间通信的核心组件之一: 它扮演者Binder进程间通信上下文(Context Manager)的角色 负责管理系统中的Service组件 向Clien ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...
随机推荐
- UE4入门学习笔记开篇
做了3年的Unity, 现在开始转入到做UE4,一来就进入一个超大项目组中学习,度过了最初2个月的生涩和紧张后,现在准备开始慢慢总结,慢慢学习,逐步深入理解和研究UE. 做了3年的游戏开发后,个人感悟 ...
- python 打飞机项目 (实战一)
第一步定义 main 函数: # -*- coding=utf-8 -*- import pygame,time from Plane import Plane from pygame.locals ...
- webpack 使用style-loader,css-loader添加css样式
// 注意:webpack 默认只能打包处理js类型的文件// 如果要处理非js类型文件,需要手动安装第三方加载器// 1安装npm install style-loader css-loader - ...
- 老版本nginx存在安全漏洞,不停服务热升级
1.场景描述 安全部通知:nginx存在"整数溢出漏洞",经测试2017年4月21日之后的版本无问题,将openresty升级到最新版本,Nginx升级到1.13.2之后的版本. ...
- xms新版发布
基于.net core 3.0.101 github地址: https://github.com/migomiddle/xms 码云地址: https://gitee.com/migomiddle/x ...
- leaflet 结合 Echarts4 实现散点图(附源码下载)
前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...
- 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)
详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类 Python中函数参数定义及调用函数时传参 ...
- linux-认识vi vim
vi 编译器 Linux vi 命令非常强大,熟练地使用它可以高效的编辑代码,配置系统文件等 命令:vi [文件] vim [文件] vi 分为三种模式:命令模式.文字模式.末尾模式 -------- ...
- WASM 成为 HTML、CSS 与 JS 之后的第 4 门 Web 语言
大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML.CSS 与 JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specif ...
- A:mysql数据库章节导航
mysql数据库章节导航 mysql5.7的安装(yum和二进制安装) 数据库的基本操作 索引 权限管理 日志管理 逻辑备份mysqldump 物理备份:xtrabackup 主从复制-传统方式 主从 ...