androidbinder原理

author author     2023-04-13     333

关键词:

参考技术A 以前看源码经常会看到Binder的东西,比如AMS,ActivityThread等,之前虽然对Binder有所了解,但也是模模糊糊的,这次终于下定决心好好的弄一弄它的原理,揭开它头上的那块面纱。

首先,Binder主要是Android 跨进程通信的一种方式,它是一个Android 中的一个类,实现了IBinder接口,主要是用在Service中。Android 跨进程通信有几种方式,Bundle、AIDL、Messenger、ContentProvider、socket等。而AIDL跟Messenger内部都是用的是Binder机制。下面就来分析一下Binder的工作机制。

首先我们需要建立三个类,一个是实体类User.kt,  继承Percelable接口

以及User.aidl, 里面定义了

parcelable User

IUserManager.aidl 定义了服务器端可调用的接口

interface IUserManager

List<User> getUserList();

void addUser(in User user)



然后build 工程,系统会在build路径下自动生成IuserManager.java文件,我们具体介绍一下里面的方法。

Binder的唯一标识,一般用类名表示

用于将服务端的Binder对象转换成客户端aidl接口类型的对象,如果客户端跟服务器端在同一个进程里面,返回的是服务器端本身,否则返回的是内部定义的Stub.Proxy()对象

该方法运行在服务器端的binder线程池中,通过code可以确定客户端请求的目标方法,然后从data中取出目标方法所需要的参数,然后再执行目标方法,执行完毕后,把结果写入reply中,如果return false,客户端请求会失败,可以用来做一些权限校验。

该方法运行在客户端,首先用android.os.Parcel.obtain()创建两个Parcel 对象 data(输入), reply(输出),如果该方法有参数的话,把参数写入data,  

data.writeInt(1)

user.writeToParcel(data,0)

然后调用服务端的transact方法来触发RPC请求,mRemote.transact(),同时当前线程挂起,然后服务端的onTransact方法会触发,直到RPC过程返回,当前线程继续执行,从reply中获取返回结果。

有两个地方需要注意,首先客户端发起远程请求时,客户端线程会被挂起,所以这个操作可能是一个耗时操作,不能在UI线程中发起请求。其次,服务端的Binder方法是运行在Binder线程池中,所以Binder方法不管是否耗时,都应该用同步的方式去实现。

另外,在进程间通信的时候,我们的binder有可能会断开,这个时候我们需要设置一个死亡代理。我们定义一个DeathRecipient对象,里面有一个回调方法binderDied(), 当Binder死亡的时候该方法会回调,然后我们可以调用unlinkToDeath()移除之前的代理,并重新绑定远程service

binder.linkToDead(mDeathRecipient,0)

还有方法isBinderAlive()也可以判断binder是否死亡。

最后,我们用AIDL中,经常需要做一些权限的校验。具体有两种方法,一种是permission校验,我们可以定义一种permission, 并且在onBind()方法中调用checkCallingOrselfPermission()对permission进行校验,客户端想绑定我们的服务必须在AndroidMenifest.xml文件中加上这个权限。

第二种方法,我们可以在onTransact方法中处理。可以用第一种方法的permission校验,也可以采用uid和pid进行校验,验证不通过,直接返回false就可以了。

androidbinder之底层原理+上层aidl流程梳理

读文字,还不如看图,这是我自己整理的框架图,可能有的地方不够准确,但对于理解Binder底层原理比较友好,点击放大查看哦。 查看详情

androidbinder之底层原理+上层aidl流程梳理

读文字,还不如看图,这是我自己整理的框架图,可能有的地方不够准确,但对于理解Binder底层原理比较友好,点击放大查看哦。 查看详情

androidbinder之底层原理+上层aidl流程梳理

读文字,还不如看图,这是我自己整理的框架图,可能有的地方不够准确,但对于理解Binder底层原理比较友好,点击放大查看哦。 查看详情

androidbinder原理servicemanager的启动过程(代码片段)

本文首发于微信公众号「后厂技术官」关联系列AndroidAOSP基础系列Android系统启动系列应用进程启动系列Android深入四大组件系列Android深入理解Context系列Android深入理解JNI系列Android解析WindowManagerAndroid解析WMS系列Android解析AMS系列Andr... 查看详情

androidbinder原理系统服务的注册过程(代码片段)

关联系列AndroidAOSP基础系列Android系统启动系列应用进程启动系列Android深入四大组件系列Android深入理解Context系列Android深入理解JNI系列Android解析WindowManagerAndroid解析WMS系列Android解析AMS系列Android包管理机制系列Android输入系统系列... 查看详情

❤️androidbinder原理图解❤️(代码片段)

关注:微信公众号「帅次」,获取更多内容。        之前了解到进程与多进程,涉及多进程不可避免的遇到了进程间通信,说到进程间通信,Binder成了一道绕不过的坎。接下来咱们逐一了解。🔥什么... 查看详情

androidbinder原理学习binder前必须要了解的知识点

本文首发于微信公众号「后厂村码农」关联系列AndroidAOSP基础系列Android系统启动系列应用进程启动系列Android深入四大组件系列Android深入理解Context系列Android深入理解JNI系列Android解析WindowManagerAndroid解析WMS系列Android解析AMS系列Andr... 查看详情

androidbinder跨进程通信原理分析

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

androidbinder原理servicemanager中的binder机制(代码片段)

本文首发于微信公众号「后厂技术官」前言在上一篇文章中,我们了解了学习Binder前必须要了解的知识点,其中有一点就是Binder机制的三个部分:JavaBinder、NativeBinder、KernelBinder,其中JavaBinder和NativeBinder都是应用... 查看详情

androidbinder通信一次拷贝的原理(代码片段)

前言对于Android开发者来说Binder应该不会陌生了,Binder是Android提供的IPC通信机制,它是通过内存映射实现的,而这也是Binder相对于其他传统进程间通信方式的优点之一,即我们说的Binder只需要做“一次拷贝”,... 查看详情

androidbinder通信一次拷贝的原理(代码片段)

前言对于Android开发者来说Binder应该不会陌生了,Binder是Android提供的IPC通信机制,它是通过内存映射实现的,而这也是Binder相对于其他传统进程间通信方式的优点之一,即我们说的Binder只需要做“一次拷贝”,... 查看详情

androidbinder的主要内容概述以及特性和原理(代码片段)

一、主要内容[图片上传失败…(image-7ac5-1628086130715)]Binder在Android中有举足轻重的地位,不管是Activty的启动流程,还是四大组件的通讯方式都一一和binder有着细密的关联。主要从四个大方向介绍Binder:Binder由来和特性&#x... 查看详情

androidbinder原理

参考技术A以前看源码经常会看到Binder的东西,比如AMS,ActivityThread等,之前虽然对Binder有所了解,但也是模模糊糊的,这次终于下定决心好好的弄一弄它的原理,揭开它头上的那块面纱。首先,Binder主要是Android跨进程通信的一种... 查看详情

androidbinder机制完全解析

概述之前我写过一篇文章AndroidService全面解析,简单实现了如何通过AIDL实现Service的跨进程通信(IPC),其实是通过Binder机制来实现的,本文我们就重点来看看Binder机制的原理。Binder可以提供系统中任何程序都... 查看详情

androidbinder框架层详解(代码片段)

在了解完binder在native层以及驱动层的基本流程之后(参考Android如何注册服务到ServiceManager;Android系统服务管家servicemanager启动过程详解),接下来这篇文章我们就来分析下binder在framework层(Java层)的具体原理与实现,... 查看详情

androidbinder服务端分析(代码片段)

本篇文章以这篇为锚点AndroidBinder应用程序Binder启动源码分析_we1less的博客-CSDN博客从startThreadPool开始进行分析joinThreadPool    路径 frameworks/native/libs/binder/IPCThreadState.cpp    循环执行getAndExecuteCommandvoidjoinThreadPool(booli 查看详情

深入理解linuxrpc-从linuxrpc到androidbinder

...项目中能够根据需求进行合理抉择。最后,我们会将AndroidBinder作为具体案例进行解剖,对其整体架构、运作机制等进行全面、深入、详尽的学习,使大家深入了解其实现细节,理解Binder的设计特点,掌握Binder... 查看详情

androidbinder解析(代码片段)

相关源码路径:/framework/base/core/java/Android/os/IInterface.java/framework/base/core/java/Android/os/IServiceManager.java/framework/base/core/java/Android/os/ServiceManager.java/framework/base/core/ 查看详情