【安卓跨进程通信IPC】-- Binder

目录

Binder

夯实基础之超详解Android Binder的工作方式与原理以及aidl示例代码

比较详细的介绍:Android跨进程通信:图文详解 Binder机制 原理
操作系统:图文详解 内存映射

一篇短的介绍:Binder原理解析

很详细的介绍:Android之Binder原理剖析
Android跨进程通信:图文详解 Binder机制 原理
Android之Binder原理剖析
Binder核心原理解析

binder面试题:
【干货满满】关于Binder的一些面试问题

Binder是什么?

是一种IPC方式;

是一种虚拟的物理设备驱动,即Binder驱动,连接service进程、client进程和ServiceManager进程的纽带;

从安卓代码的实现角度,binder是一个类,实现了IBinder接口。

进程空间分配

用户空间:进程间相互隔离

内核空间:进程间共享

进程内用户空间和内核空间进行交互需通过系统调用来实现:copy_from_user()和copy_to_user()

进程隔离

为了保证 安全性 & 独立性,一个进程 不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的。

传统的IPC通信需要做2次数据拷贝:用户空间->内核空间->用户空间,效率低下。

而Binder的作用则是:连接两个进程,通过调用mmap()内存映射系统函数,主要负责创建数据接收的缓存空间 & 管理数据接收缓存,最终通过1次数据拷贝就实现了两个进程间的数据通信。

Binder跨进程通信机制模型

是基于Client-Server模式。

基本的流程:(详细流程见原链接)

  1. server进程通过binder驱动向ServiceManager注册服务,binder驱动将注册信息同步给Service Manager进行管理;
    Binder实体是Server进程在Binder驱动中的存在形式;该对象保存Server和ServiceManager的信息(保存在内核空间中);Binder驱动通过内核空间的Binder实体找到用户空间的Server对象。
  2. client进程通过向binder驱动发送获取指定服务的请求,传递要获取的服务名称,binder驱动通过Servcie Manager找到对应的binder实体,发挥实体引用给client进程;
  3. client进程通过binder实体引用使用服务。

binder驱动:一种虚拟设备驱动,连接server进程、client进程和Service Manager的桥梁,具体作用:

  1. 传递进程间的数据:通过内存映射,数据拷贝1次,传输效率高;
  2. 实现线程控制:采用Binder线程池,并由Binder驱动自身进行管理。
    Binder驱动持有每个server进程在内核空间中的binder实体,并给client进程提供binder实体的引用。

内存映射:

  1. binder驱动创建一块接收缓存区;
  2. 实现地址映射关系:实现内核缓存区和接收进程用户空间地址同时映射到同一个共享接收缓存区;
  3. 发送进程通过copy_from_user()发送数据到虚拟内存区域;
  4. 由于内核缓存区和接收进程的用户空间地址存在映射关系,故相当于也发送到了接收进程的用户空间地址,即实现了跨进程通信。

说明:

  1. Client进程、Server进程 & Service Manager 进程之间的交互 都必须通过Binder驱动(使用 open 和 ioctl文件操作函数),而非直接交互。
  2. Binder驱动 & Service Manager进程 属于 Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程 属于Android应用层(需要开发者自己实现)
  3. Binder请求的线程管理:Binder模型的线程管理 采用Binder驱动的线程池,并由Binder驱动自身进行管理;一个进程的Binder线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。

优点

  1. 高效:数据拷贝只需要1次,而管道、消息队列、Socket都需要2次,通过驱动在内核空间拷贝数据,不需要额外的同步处理。
  2. 安全性高:Binder机制为每个进程分配了UID/PID作为鉴别身份的标志,在Binder通信时会根据其进行有效性检测;传统的IPC方式对于双方的身份并没有做出严格的验证,如Socket通信ip地址都是客户端手动填入,容易出现伪造。
  3. 使用简单:采用CS架构,有AIDL机制使得开发者能够更加容易的使用和集成。

AIDL

Android:学习AIDL,这一篇文章就够了(上)
你真的理解AIDL中的in,out,inout么?

常见面试题

【干货满满】关于Binder的一些面试问题
面试 | 再也不怕被问 Binder 机制了

Android中进程和线程的关系,区别?

为何需要进行IPC,多进程通信可能会出现什么问题?

Android中IPC方式有几种、各种方式优缺点? 为何新增Binder来作为主要的IPC方式?

什么是Binder?

Binder的原理?

Binder Driver 如何在内核空间中做到一次拷贝的?
Binder 驱动加载过程中有哪些重要的步骤?
系统服务是什么时候注册的?

使用Binder进行数据传输的具体过程?

Binder框架中ServiceManager的作用?
系统服务与bindService启动的服务的区别?
系统服务与bindService等启动的服务的区别
【Android话题-2.4系统服务】系统服务和bind的应用服务有什么区别
Activity的bindService流程?
bindService方法流程
Android进阶笔记:bindService的流程--源码解析
Android四大组件系列6 bindService流程
使用 Binder 传输一次数据的最大限制是多少,被占满后会导致什么问题?

什么是AIDL?

AIDL使用的步骤?

AIDL支持哪些数据类型?

AIDL的关键类,方法和工作流程?
如何优化多模块都使用AIDL的情况?

不通过AIDL,手动编码来实现Binder的通信?

相关推荐
ac-er88882 小时前
Yii框架中的队列:如何实现异步操作
android·开发语言·php
流氓也是种气质 _Cookie4 小时前
uniapp 在线更新应用
android·uniapp
zhangphil6 小时前
Android ValueAnimator ImageView animate() rotation,Kotlin
android·kotlin
徊忆羽菲7 小时前
CentOS7使用源码安装PHP8教程整理
android
编程、小哥哥8 小时前
python操作mysql
android·python
Couvrir洪荒猛兽8 小时前
Android实训十 数据存储和访问
android
五味香10 小时前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
十二测试录11 小时前
【自动化测试】—— Appium使用保姆教程
android·经验分享·测试工具·程序人生·adb·appium·自动化
Couvrir洪荒猛兽13 小时前
Android实训九 数据存储和访问
android
aloneboyooo13 小时前
Android Studio安装配置
android·ide·android studio