Binder的工作机制浅析
在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制。
一、在Android Studio中建立AIDL
首先,我们需要建立一个AIDL
1.在建立了对应的实现Parcelable接口的实体类和AIDL接口后,文件结构如下:
2.点击clean Project/reBuild Project,出现如下错误:提示无法找到Book实体类。
3.解决方案
这个问题的出现是因为我还没有在build.gradle中对默认的sourceSets进行修改,默认情况下他指定的源码目录不包括aidl。
加入下面语句后同步build.gradle,再重建工程即可。
在app下的build.gradle添加:
系统自动生成的IBookManager
二、Binder原理分析
通过Structure
我们可以看到这个系统生成这个接口文件包括一个静态抽象类Stub和两个方法getBookList()和addBook(),这两个方法很显然就是我们之前在IBookManager.aidl中声明的方法,此外它还为这两个方法用两个int来标示,从而在onTransact()方法中起到标示作用,如下所示:
而内部类Stub继承自Binder,在这个类内部又有一个代理类Proxy。接下来看这一段代码:
这里判断了客户端和服务端是否处于同一个进程中,如果处于同一个进程中,则方法调用不会走跨进程的transact方法,而如果处于不同的进程中,则需要通过其中的代理里proxy来完成。下面展现代理类
在这个代理类中的getBookList和addBook方法中调用transact方法来发起RPC(远程过程调用)请求,并将当前线程挂起,然后服务端的onTransact方法响应并执行,当RPC过程返回后,当前线程继续执行。
从上述描述中我们可以得出Binder的大概工作方式了,但其中有两点需要特别说明:
1.其实刚才也已经有所提及,即当客户端发起远程调用时会将当前线程挂起直至服务端方法执行完毕后才继续执行,所以如果一个远程方法比较耗时的话,是不能在UI线程中发起远程请求的,需要我们开启一个子线程然后再去进行远程调用。
2.由于服务端的Binder方法是运行在Binder的线程池中的,所以我们需要以同步的方式去实现保证线程安全。
Binder的工作机制具体如下图所示:
三、Binder的两个重要方法
上面我们提到Binder运行在服务端进程,那么如果服务端进程由于某种原因异常终止,这个时候服务端的Binder死亡,会导致我们的远程调用失败,并且我们还不知道Binder连接断裂了。所以我们需要有方法来提示我们Binder已经断裂,然后我们就可以重新绑定远程Service。
为此,Binder提供了两个配对的方法linkToDeath和unlinkToDeath,通过linkToDeath我们可以给Binder设置一个死亡代理,当其死亡时我们就能知道从而重现发起连接。
具体如下:
- private IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient(){
- @Override
- public void binderDied() {
- if(mBookManager==null)
- return;;
- mBookManager.asBinder().unlinkToDeath(mDeathRecipient,0);
- mBookManager=null;
- //TODO:这里重现绑定远程Service
- }
- };
在客户单绑定远程服务成功后,给binder设置死亡代理。
- mService=IMessageBoxManager.Stub.asInterface(binder);
- binder.linkToDeath(mDeathRecipient,0);
其中linkToDeath的第二个参数是个标记位,这里我们直接设为0,。
Binder的工作机制浅析的更多相关文章
- Binder的工作原理浅析
在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...
- Android IPC机制—Binder的工作机制
进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...
- MySQL Proxy和 Amoeba 工作机制浅析
MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和 ...
- Java I/O 的工作机制浅析
I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 ...
- Android 进阶8:进程通信之 Binder 机制浅析
读完本文你将了解: IBinder Binder Binder 通信机制 Binder 驱动 Service Manager Binder 机制跨进程通信流程 Binder 机制的优点 总结 Than ...
- oracle的resetlogs机制浅析
oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用?它的原理 ...
- Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程
本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...
- 红茶一杯话Binder (传输机制篇_下)
红茶一杯话Binder (传输机制篇_下) 侯 亮 1 事务的传递和处理 从IPCThreadState的角度看,它的transact()函数是通过向binder驱动发出BC_TRANSACTION语 ...
- 红茶一杯话Binder (传输机制篇_中)
红茶一杯话Binder (传输机制篇_中) 侯 亮 1 谈谈底层IPC机制吧 在上一篇文章的最后,我们说到BpBinder将数据发到了Binder驱动.然而在驱动层,这部分数据又是如何传递到BBind ...
随机推荐
- UCloud 云服务器硬盘扩容后 如何挂载到本机
UCloud 云服务器硬盘扩容后如何挂载到本机 UCloud 提供的云服务器会根据不同的系统初始化不同空间大小的硬盘资源,此资源默认为 系统盘. 针对 Linux 系统默认初始化 20G 的空间,一般 ...
- 2018年总结和2019年的Flag
---恢复内容开始--- 目前截止到现在工作将近一年半了,今天工作上主要后端主要是用了两种语言,java和Python(2.7),今年完成主要的工作主要使用Python在写一些脚本来满足财务和人资部门 ...
- Crypto 加密解密
import binascii from Crypto.Cipher import AES #秘钥,此处需要将字符串转为字节 from utils import config from utils.e ...
- unittest框架,调用函数类 和 调用函数外的 方法
- Scanner 的练习 。。。。依然不懂用法。。。苦恼
package com.b; import java.util.Random; import java.util.Scanner; public class Core { public static ...
- Pycharm快速复制当前行到下一行Ctrl+D
Pycharm快速复制当前行到下一行Ctrl+D
- angular 三大核心函数
1.$watch angular监听 由于angular一直在实时监听,所以比react和vue效率要低 $scope.$watch('aModel', function(newValue, o ...
- Java面试(三)
1 java中Exception 和 Error 区别 都是Throwable的子类.RuntimeException继承自Exception. Error和RuntimeException及其子类 ...
- U-boot分析与移植(2)----U-boot stage1分析
我们要生成u-boot.bin文件,它首先依赖于很多.o文件和.lds链接脚本文件 我们只要找到对应的.lds链接脚本文件就可以分析u-boot的启动流程. 1.打开u-boot-1.1.6\u-bo ...
- window下配置Solr6.5以及IK Analyzer分词配置
一.安装准备及各软件使用版本说明: 1.下载jdk,我下载的版本是jdk-8u121-windows-x64.exe,下载地址: http://www.oracle.com/technetwork/j ...