理解Binder机制

article/2025/10/29 0:40:49

前言

​ Android中Binder机制的重要性不言而喻,从IPC角度来看, Binder是一种跨进程通信方式,Binder也可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder;从Android framework角度来说,Binder是Service Manager连接各种Manager和相应ManagerService的桥梁;从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时服务端会返回一个包含了服务端业务的Binder对象,用于客户端获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。

一.什么是Binder

​ 什么是Binder,应该怎么去理解Binder呢?首先介绍Binder为了实现进程之间的通信需要解决哪些问题:

//1.如何知道客户端需要调用哪个进程以及该进程中的方法
//2.客户端如何将函数形参发送给远程进程中的函数,以及如何将远程进程函数计算结果返回客户端
//3.如何去屏蔽底层通信细节,让实现客户端调用远程函数就像调用本地函数一样

第一个问题很容易解决,只要给每个需要远程通信的类一个唯一标识,可以通过包名+类名的字符串以标识,然后在类里面给每个函数编号即可对函数唯一编码。

第二个问题,定义一个可打包的接口Parcelable,这个接口提供2个重要函数,分别是将对象中的属性写入到数组和从数组中的数据还原对象,每个可以发送到远程函数作为形参的对象只需实现Parcelable接口即可。Parcelable具体使用可以参考Android开发——进程间通信之AIDL(二)。

第三个问题,为了屏蔽进程之间的通信细节,那么Android团队肯定想定义一个类,由这个类来实现这些细节。这个类应该做哪些事情呢?首先,这个类得帮用户发送远程请求并将返回结果提交给用户,这是最重要的功能了,有了这个功能,妈妈再也不用担心我的进程间通信了。其次,如果我想实现服务端,什么时候客户端调用我,这些细节不用用户操心。当然,这个类还要帮用户封装更多细节。既然打算定义这个类了,那总得取个响当当的名称吧,什么?你说取名为Binder,好吧,那就叫Binder吧。服务端想要实现被跨进程访问,就必须继承Binder类。

有一点很重要,就是客户端发起远程服务调用时当前线程会被挂起,因此如果远程进程是执行长时间的运算,请不要使用主线程去调用远程函数,以防止ANR。

二. Binder的实现机制

说起Binder机制,下面这张图就是经典中的经典了。
在这里插入图片描述

2.1 Binder驱动

Binder驱动是一段运行在内核空间的代码,它是Binder机制的核心,负责Binder节点的建立,和进程间的信息传递。通过"/dev/binder"的文件在内核空间和用户空间来回搬数据。Linux ioctl 函数实现了从用户空间转移到内核空间的功能。

2.2 ServiceManager

ServiceManager是Init程序启动的守护进程之一,它是Android中Binder通信机制的基础。

ServiceManager提供了注册,检索服务的功能。即这些服务由ServiceManager来统一进行管理。

而ServiceManager启动的过程做了三件事:

(1)通过open打开设备文件/dev/binder,把文件内容映射到内核空间中,由于内核空间是所有进程共享的区域,所以借助这块区域,可以实现进程间通信。

(2)通过IO控制命令BINDER_SET_CONTEXT_MGR将当前进程注册到Binder驱动中,Binder驱动便会为他在内核空间创建一个Binder实体,并且将其句柄设置为0,从句柄值也能看出来,这个节点在Binder驱动中是唯一的,系统会将跨进程服务注册到它的服务列表里面,服务列表中存储的便是服务名字+这个服务在Binder驱动中大于0的句柄。

(3)最终ServiceManager也是会进入一个无限循环,等待客户端的IPC请求。

2.3 服务注册

Zygote进程会孵化出的第一个子进程就是SystemService,我们大部分的系统服务比如ActivityManagerService、WindowManagerService等都是该进程内的一个线程,这些服务会通过调用ServiceManager.addService方法添加到ServiceManager中的服务列表中。

(1)Server首先将自己作为对象,并且附上一个句柄为0的值(用于访问ServiceManager),并将这些内容封装成一个数据包后通过open Binder的设备文件/dev/binder发送给Binder驱动。
(2)Binder驱动首先会查看是否有该Server对应的Binder实体,如果没有就创建Binder实体并赋予一个大于0的句柄,接着会把这个句柄和服务名字等信息发送给ServiceManager。
(3)ServiceManager会首先查看服务列表中是否已经存在这个服务,不存在的话,就把这个服务和它的Binder驱动中的句柄加入到服务列表中。

2.4 服务调用

(4)Client想调用某服务时,会把该服务的名字,加上一个句柄为 0 的值封装为一个数据包并发送给Binder驱动。

(5)Binder驱动接收到句柄为0,就会将这数据包扔给ServiceManager。

(6)ServiceManager接收到数据包后就会找某个名字的服务,然后将对应服务的句柄发送给Binder驱动,再发送回客户端。

(7)Client获取句柄之后,会利用这个句柄信息在自己本地创建一个远程Server的代理,以后Client发消息都是发给这个代理的,随后的通信便变成了代理通过Binder驱动与真正的Server进行交互了。

客户端调用这个服务时,会加上参数、标识符(标记远程对象及其函数)等数据放入到Client的共享内存,Binder驱动根据这些数据找到对应的远程服务进程的共享内存,并把数据拷贝到内核空间,并映射到远程服务进程中,并通知远程进程执行onTransact()函数,远程进程Binder对象执行完成后将结果写入自己的共享内存中,Binder驱动再将结果数据拷贝到内核空间,并映射到客户端进程中,并唤醒客户端线程。

三. Android为什么要使用Binder机制

3.1 性能

Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次(共享内存方式一次内存拷贝都不需要)。

3.1.1 Binder如何实现的一次拷贝

Linux内核实际上没有从一个用户空间到另一个用户空间直接拷贝的函数,只有从用户空间拷贝到内核空间的函数(copy_from_user),和反过来的copy_to_user()函数。所以说,为了实现用户空间到用户空间的拷贝,mmap()分配的内存除了映射到接收方进程里,还映射到内核空间。所以调用copy_from_user()将数据拷贝进内核空间也相当于拷贝进了接收方的用户空间,这就是Binder只需一次拷贝的原因。

3.2 方便性

Binder是基于客户端/服务器架构的,Server端与Client端相对独立,在客户端这边实现了一个代理,而在服务端通过线程池的方式来响应请求。客户端能够很方便地、像调用本地方法一样调用远程方法。

3.3 安全性

传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而在Android中使用Binder进程间通信时,需要对发送方和接收方的UID/PID进行验证,保证通信信息的安全性。

感谢:

http://blog.csdn.net/qianhaifeng2012/article/details/51602105

http://blog.csdn.net/linmiansheng/article/details/37918333

https://www.zhihu.com/question/39440766/answer/89210950

http://blog.csdn.net/huachao1001/article/details/51504469


http://chatgpt.dhexx.cn/article/KZsEEgON.shtml

相关文章

Android--Binder机制

Android--Binder机制 1.简介 Binder是什么? 机制:Binder是一种进程间通信的机制 驱动:Binder是一个虚拟物理设备驱动 应用层:Binder是一个能发起进程间通信的JAVA类 Binder就是Android中的血管,在Android中我们使用…

Binder 机制

Binder 是 Android 系统进程间通信(IPC:Internet Process Connection)方式之一。Linux 已经拥有的 IPC 手段包括: 管道(Pipe)、信号(Signal)、跟踪(Trace)、插…

Android Binder机制

Android Binder机制 什么是BinderBinder一般的IPC原理动态内核可加载模块内存映射运行机制四大角色注册服务使用服务 对象的传递Binder通信 什么是Binder 要理解binder,先要知道IPC,Inter-process communication ,也就是进程中相互通信,Bind…

Binder机制

直观来讲,Binder是Android中的一个类,它实现了IBinder接口。从IPC角度来看,Binder是Android中一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没…

Binder机制原理

前言 本篇文章记录本人对Binder的学习,因为本人能力有限,若有错误,还请批评指正。 binder的使用文章推荐 1.Binder是什么? 可以理解是为Android的血管。是一种进程间通信的机制。比如Activity,Service需要和AMS通信…

Binder机制(非常好理解)

Binder是一种进程间通信机制,用来实现不同进程之间的通信。 Binder机制主要由四大块组成,分别是客户空间的client、server,serverManager,还有内核的Binder驱动。 下面我先看下图,利于理解Binder内部工作机制&#x…

Android进程间通信之一:Binder机制学习

Binder机制学习 Binder驱动Binder核心APILinux 使用两级保护机制:0 级供系统内核使用,3 级供用户程序使用。 Linux 下的传统 IPC 通信原理Linux 下的传统 IPC 通信原理Binder通信过程ServiceManager进程启动MMAP Binder驱动 binder驱动在以misc设备进行注…

Android跨进程通信:图文详解 Binder机制 原理

前言 如果你接触过 跨进程通信 (IPC),那么你对Binder一定不陌生虽然 网上有很多介绍 Binder的文章,可是存在一些问题:浅显的讨论Binder机制 或 一味讲解 Binder源码、逻辑不清楚,最终导致的是读者们还是无…

操作系统实验五--存储管理

文章目录 操作系统实验五--存储管理一、实验目的二、实验内容三、设计原理及相关算法四、结果分析五、源代码 操作系统实验五–存储管理 一、实验目的 1、了解虚拟存储技术的特点,掌握请求页式存储管理的主要页面置换算法原理。 2、掌握请求页式存储管理中页面置…

操作系统实验—存储管理

操作系统实验—存储管理 所有实验源码: gitee:https://gitee.com/infiniteStars/os-project github:https://github.com/helloworldzsq/OSproject 1.实验内容 设计一个虚拟存储区和内存工作区,并使用下述方法计算访问命中率。 ①…

操作系统实验——磁盘调度算法

文章目录 前言一、实验目的二、实验内容和要求三、实验程序四、运行结果运行结果截图 五、思考和分析程序实现(思路):分析几种算法: 附 前言 提示:本次实验在Linux(Ubuntu)中运行,程序中读取的文件需放在与c文件同一个文件夹中&a…

北航操作系统实验入门

有北航操作系统实验平台账号的部分读者反映不会操作。为了让读者尽快了解实验平台的操作,下面介绍lab0的实验步骤,希望读者能尽快掌握实验平台的使用方法。 1. 用学生账号登录 2. 点击【操作系统实验】进入实验界面 3. lab0实验环境介绍,仔细…

操作系统实验三进程间通信

文末也可直接获取实验文档 实验三 进程间通信 目录 1实验目的2 实验内容3实验详细操作步骤及程序清单:4相关问题及思考5总结6背景知识 1实验目的 1、了解linux系统中进程通信的基本原理。 2、分析进程竞争资源现象,学习解决进程互斥的方法。 2 实验内…

操作系统实验——进程控制

操作系统实验——进程控制 预习内容: 1.进程的概念 ⑴程序的并发执行 ⑵进程的定义 2.进程的描述 ⑴进程控制块 ⑵进程上下文 ⑶进程上下文切换 ⑷进程空间与大小 3. 进程状态及其转换 ⑴进程状态 ⑵进程状态转换 4.进程控制 ⑴进程创建与撤销 ⑵进程的阻塞与唤醒…

操作系统实验一

操作系统实验一 进程调度算法 一、实验目的 1.理解操作系统进程管理中进行进程调度的过程和调度算法的思想原理; 创建进程控制块PCB,并合理组织就绪队列。 2.理解进程的状态及变化,动态显示每个进程的当前状态及进程的调度情况。 掌握几…

操作系统实验一·创建进程

创建进程 1实验目的2实验内容:2.1Windows实现2.2Linux实现 3实验环境3.1Windows3.2Linux虚拟机 4程序设计和实现4.1Windows实现4.1.1函数解释4.1.2程序代码4.1.3运行结果 4.2Linux实现4.2.1函数解释4.2.2程序代码4.2.3运行结果 Use system calls to implement a “m…

操作系统实验

实验一 命令解释程序 实验内容 利用C语言编写一个微型命令解释程序minishell.c,该程序可接收并解释以下命令: (1) dir 列出当前目录 (2) cop file1 file2 拷贝文件 (3) era filename 删除文件 (4) disp string 显示字符串 (5) end 结束,退出…

操作系统实验报告

操作系统 一、实验一 通过 VMware 虚拟机软件安装 Linux二、实验目的三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码)四、实验结果与分析五、小结与心得体会 一、实验二 Windows 进程管理二、实验目的三、实验内容&…

操作系统实验——银行家算法

文章目录 一、实验目的二、实验内容和要求三、实验原理算法实现 四、实验程序代码如下: 五、验证数据和运行结果运行结果截图 六、思考与分析附 一、实验目的 掌握银行家算法思想,并能编程实现。 二、实验内容和要求 1、在Linux环境下编译运行程序&am…

操作系统实验(进程调度)

操作系统实验(进程调度) 一、实验目的二、实验内容三、实验准备3.1优先权算法3.2时间片轮转调度算法 四、实验 一、实验目的 1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。 二、实验内容 2.1…