binder的工作机制浅析

行歌 行歌     2022-09-06     607

关键词:

在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,。

 

浅析一个lua文件窥slua工作机制

slua的东西不是几句话能讲得完,这里只说结论不说原因,原因有空写个LittleSlua工程来解释,下面注释中有几个关键点:LuaVar系列类:LuaFunction,LuaTable,LuaDelegate的使用,类型表和实例表,__parent代表继承关系,存ud的表是弱表(可... 查看详情

浅析java虚拟机结构与机制

...个概念性的入门,主要介绍了JVM的组成部分以及它们内部工作的机制和原理。当然本文只是一个简单的入门,不会涉及过多繁杂的参数和配置,感兴趣的同学可以做更深入的研究,在研究JVM的过程中会发现,其实JVM本身就是一个... 查看详情

细读《深入理解android内核设计思想》binder机制[下](代码片段)

...,对重点深入补充,输出结构清晰的精简版深入binder驱动内部binder_ioctlbinder_get_threadbinder_ioctl_write_readbinder_thread_writebinder_transactionbinder_thread_read小结binderQ&A如何找到目标进程Binder实体如何实现Binder线程的睡眠与唤醒最... 查看详情

binder机制总结(代码片段)

BInder机制Linux内核的基础知识进程隔离/虚拟地址空间操作系统当中为了保证进程间互不干扰,设计了进程隔离的技术,避免了一个进程去操作另一个进程的数据。进程隔离用到了虚拟地址空间,不同进程的虚拟地址空间是不同的... 查看详情

binder机制在aidl中的实现分析

本篇主要通过结合已经阅读的Binder机制相关资料(《Android开发艺术探索》和http://weishu.me/2016/01/12/binder-index-for-newer/),通过AIDL来进行Binder机制的初步理解感谢两位作者:任玉刚和WeiShu一一个AIDLDemo的组成部分二通信机制的分析1bindS... 查看详情

从mediaserver入手快速理解binder机制(最简单理解binder)

...;https://blog.csdn.net/u010164190/article/details/53015194 Android的binder机制提供一种进程间通信的方法,使一个进程可以以类似远程过程调用的形式调用另一个进程所提供的功能。binder机制在Java环境和C/C++环境都有提供。   andr... 查看详情

android:安卓学习笔记之binder机制的简单理解和使用(代码片段)

Binder机制的简单理解和使用Binder机制1、背景1.1、进程空间划分1.2、进程隔离&跨进程通信(IPC)2、Binder到底是什么?3、Binder跨进程通信机制模型3.1、模型原理图3.1.1、模型拓展3.2、模型组成角色说明3.3、Binder驱动3.... 查看详情

android——binder机制(代码片段)

1.简介Binder是什么?机制:Binder是一种进程间通信的机制驱动:Binder是一个虚拟物理设备驱动应用层:Binder是一个能发起进程间通信的JAVA类Binder就是Android中的血管,在Android中我们使用Activity,Service等组件都需... 查看详情

binder机制进程通信-正常情况|进程通信-mmap内存映射|binder机制重要组件

...情况(两次拷贝)二、进程通信-mmap内存映射(一次拷贝)三、Binder机制重要组件(Client客户端、Server服务端、ServiceManager、Binder驱动)一、进程通信-正常情况(两次拷贝)Binder通信机制依赖于共享的内核空间;正常情况下,进行进程间的通信... 查看详情

[android5.1]binder机制学习---binder框架

Binder框架Android系统中Binder机制的大体框架如下图所示:client:客户端进程server:服务端进程ServiceManager:一个特殊的server,用来注册、管理其他的server/dev/binder:binder设备,进程间的通信就是通过该设... 查看详情

androidbat高级面试合集——binder通信原理与机制

先上一张Binder的工作流程图。(如果不清晰,可以复制图片链接到浏览器或保存到本地查看,我经常都是这样看图的哈)一开始上手,陌生的东西比较多,But,其实并不复杂。喔,流程图是用ProcessO... 查看详情

红茶一杯话binder(传输机制篇_上)

红茶一杯话Binder(传输机制篇_上) 侯亮 1Binder是如何做到精确打击的?       我们先问一个问题,binder机制到底是如何从代理对象找到其对应的binder实体呢?难道它有某种制导装置吗?要回答这... 查看详情

binder机制在aidl中的实现分析(代码片段)

本篇主要通过结合已经阅读的Binder机制相关资料(《Android开发艺术探索》和http://weishu.me/2016/01/12/binder-index-for-newer/),通过AIDL来进行Binder机制的初步理解感谢两位作者:任玉刚和WeiShu一一个AIDLDemo的组成部分二通信机制的... 查看详情

varnish浅析

...程序环境:/etc/varnish/varnish.params:配置varnish服务进程的工作特性,例如监听的地址、端口及缓存机制等;/etc/varnish/default.vcl:配置各Child/Cache线程的工作属性;/usr/sbi 查看详情

详细说说binder通信原理与机制

先上一张Binder的工作流程图。(如果不清晰,可以复制图片链接到浏览器或保存到本地查看,我经常都是这样看图的哈)更多Android高级面试合集放在github上面了(更多面试文档,项目下载,源码)https://github.com/xiangjiana/androids需... 查看详情

红茶一杯话binder(传输机制篇_下)

红茶一杯话Binder(传输机制篇_下) 侯亮 1事务的传递和处理       从IPCThreadState的角度看,它的transact()函数是通过向binder驱动发出BC_TRANSACTION语义,来表达其传输意图的,而后如有必要,它会等... 查看详情

binder机制native层binder机制分析(service_manager.c|开启binder|注册binder进程上下文|开启binder循环)(代码片(代码片段)

文章目录一、系统服务二、系统服务主函数三、开启Binder四、注册上下文五、开启Binder循环六、binder_write方法七、binder_ioctl内核方法八、binder_ioctl_write_read内核方法一、系统服务SystemServer是由Zygote进程fork()出来的;Init进程启动Zygot... 查看详情

androidbinder机制介绍

...四大组件的启动过程、AMS、PMS等等时,都会遇到一个叫做Binder的东西。结合笔者的经验,Binder可以说是深入理解Android 查看详情