【安卓跨进程通信IPC】-- Binder
目录
- Binder
- Binder是什么?
- 进程空间分配
- 进程隔离
- Binder跨进程通信机制模型
- 优点
- AIDL
- 常见面试题
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模式。
基本的流程:(详细流程见原链接)
- server进程通过binder驱动向ServiceManager注册服务,binder驱动将注册信息同步给Service Manager进行管理;
Binder实体是Server进程在Binder驱动中的存在形式;该对象保存Server和ServiceManager的信息(保存在内核空间中);Binder驱动通过内核空间的Binder实体找到用户空间的Server对象。 - client进程通过向binder驱动发送获取指定服务的请求,传递要获取的服务名称,binder驱动通过Servcie Manager找到对应的binder实体,发挥实体引用给client进程;
- client进程通过binder实体引用使用服务。
binder驱动:一种虚拟设备驱动,连接server进程、client进程和Service Manager的桥梁,具体作用:
- 传递进程间的数据:通过内存映射,数据拷贝1次,传输效率高;
- 实现线程控制:采用Binder线程池,并由Binder驱动自身进行管理。
Binder驱动持有每个server进程在内核空间中的binder实体,并给client进程提供binder实体的引用。
内存映射:
- binder驱动创建一块接收缓存区;
- 实现地址映射关系:实现内核缓存区和接收进程用户空间地址同时映射到同一个共享接收缓存区;
- 发送进程通过copy_from_user()发送数据到虚拟内存区域;
- 由于内核缓存区和接收进程的用户空间地址存在映射关系,故相当于也发送到了接收进程的用户空间地址,即实现了跨进程通信。
说明:
- Client进程、Server进程 & Service Manager 进程之间的交互 都必须通过Binder驱动(使用 open 和 ioctl文件操作函数),而非直接交互。
- Binder驱动 & Service Manager进程 属于 Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程 属于Android应用层(需要开发者自己实现)
- Binder请求的线程管理:Binder模型的线程管理 采用Binder驱动的线程池,并由Binder驱动自身进行管理;一个进程的Binder线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。
优点
- 高效:数据拷贝只需要1次,而管道、消息队列、Socket都需要2次,通过驱动在内核空间拷贝数据,不需要额外的同步处理。
- 安全性高:Binder机制为每个进程分配了UID/PID作为鉴别身份的标志,在Binder通信时会根据其进行有效性检测;传统的IPC方式对于双方的身份并没有做出严格的验证,如Socket通信ip地址都是客户端手动填入,容易出现伪造。
- 使用简单:采用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的通信?
相关文章:
【安卓跨进程通信IPC】-- Binder
目录 BinderBinder是什么?进程空间分配进程隔离Binder跨进程通信机制模型优点AIDL常见面试题 Binder 夯实基础之超详解Android Binder的工作方式与原理以及aidl示例代码 比较详细的介绍:Android跨进程通信:图文详解 Binder机制 原理 操作系统…...
大数据之Schedule调度错误(一)
当我们在利用ooize发起整个任务的调度过程中,如果多个调度任务同时运行并且多个调度任务操作了相同的表,那么就会出现如下的错误关系: Invalid path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/admin/xxx: No files matching path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/ad…...
DiffIR论文阅读笔记
ICCV2023的一篇用diffusion模型做Image Restoration的论文,一作是清华的教授,还在NIPS2023上一作发表了Hierarchical Integration Diffusion Model for Realistic Image Deblurring,作者里甚至有Luc Van Gool大佬。模型分三个部分,…...
prometheus+alertmanager+webhook钉钉机器人告警
版本:centos7.9 python3.9.5 alertmanager0.25.0 prometheus2.46.0 安装alertmanager prometheus 配置webhook # 解压: tar -xvf alertmanager-0.25.0.linux-amd64.tar.gz tar -xvf prometheus-2.46.0.linux-amd64.tar.gz mv alertmanager-0.25.0.linu…...
ctfshow 年CTF web
除夕 Notice: Undefined index: year in /var/www/html/index.php on line 16 <?phpinclude "flag.php";$year $_GET[year];if($year2022 && $year1!2023){echo $flag; }else{highlight_file(__FILE__); } 弱比较绕过很简单,连函数都没有直…...
原型链、闭包、手写一个闭包函数、 闭包有哪些优缺点、原型链继承
什么是原型链? 原型链是一种查找规则 为对象成员查找机制提供一个方向 因为构造函数的 prototype 和其实例的 __ proto __ 都是指向原型对象的 所以可以通过__proto__ 查找当前的原型对象有没有该属性, 没有就找原型的原型, 依次类推一直找到Object( null ) 为…...
linux中SSH_ASKPASS全局变量的作用
在工作中遇到一段代码,通过SSH_ASKPASS全局变量实现了ssh登录远程IP时的密码输入,chatgpt搜索了一下,其解释大致如下所示: SSH_ASKPASS 是一个环境变量,它在 SSH 客户端需要用户输入密码时起作用。当 SSH 客户端检测到…...
9 -力扣高频 SQL 50 题(基础版)
9 - 上升的温度 -- 找出与之前(昨天的)日期相比温度更高的所有日期的 id -- DATEDIFF(2007-12-31,2007-12-30); # 1 -- DATEDIFF(2010-12-30,2010-12-31); # -1select w1.id from Weather w1, Weather w2 wheredatediff(w1.recordDate,w2.recordDat…...
TCP的重传机制
TCP 是一个可靠的传输协议,解决了IP层的丢包、乱序、重复等问题。这其中,TCP的重传机制起到重要的作用。 序列号和确认号 之前我们在讲解TCP三次握手时,提到过TCP包头结构,其中有序列号和确认号, 而TCP 实现可靠传输…...
pg 数据库,获取时间字段值的具体小时,赋值给其他字段
目录 1 问题2 实现 1 问题 pg 数据库,有一个表,其中有2个字段 一个是时间字段obstime ,一个是时次ltime字段,int 类型,现在这个表里面是obstime 里面有数据,ltime字段 没有数据,现在就是批量获…...
做视频号小店什么类目最容易爆单?其实,弄懂这三点就会选品了
大家好,我是电商花花。 我们做视频号小店做什么类目最容易爆单? 其实任何类目都有属于自己的受众人群和客户,都非常容易爆单,我们想要爆单,就要选对类目,选对产品。 视频号上所有的类目基本上可以分为标…...
Nginx作为下载站点
grep -Ev ^$|# /usr/local/nginx/conf/nginx.conf > /opt/nginx.txt cat /opt/nginx.txt > /usr/local/nginx/conf/nginx.conf用上面的指令提取最小化的配置文件 vim /usr/local/nginx/conf/nginx.conf [rootlocalhost ~]# cat /usr/local/nginx/conf/nginx.conf worker…...
vue3简单快速实现主题切换功能
⛰️个人主页: 蒾酒 🔥系列专栏:《vue3实战》 目录 内容概要 实现步骤 1.定义不同主题的css样式变量 2.入口main.ts中引入这个样式文件 3.主题样式css变量引用 4.设置默认主题样式 5.实现点击按钮主题切换 总结 最近发现了一个巨牛的人工智…...
国联易安:网络反不正当竞争,要防患于未然
据市场监管总局官网消息,为预防和制止网络不正当竞争,维护公平竞争的市场秩序,鼓励创新,保护经营者和消费者的合法权益,促进数字经济规范健康持续发展,市场监管总局近日发布《网络反不正当竞争暂行规定》&a…...
Linux 网络配置 01
基本命令 1、查看网络接口信息ifconfig ifconfig:当前设备正在工作的网卡,启动的设备 ifconfig -a :所网络设备 ifconfig信息解析: ens33: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.10.10 n…...
快速入门C++正则表达式
正则表达式(Regular Expression,简称 Regex)是一种强大的文本处理工具,广泛用于字符串的搜索、替换、分析等操作。它基于一种表达式语言,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式不仅在…...
java —— 缓冲字符输入流/缓冲字符输出流
缓冲字符输入流/缓冲字符输出流是对字符输入流/字符输出流的加强,在使用中仍旧要借助于字符输入流/字符输出流才能完成实现。与字符输入流/字符输出流按照字符为单位进行输入/输出不同的是,缓冲字符输入流/缓冲字符输出流能够以行为单位进行读取和写入。…...
blender从视频中动作捕捉,绑定到人物模型
总共分为3个步骤: 1、从视频中捕捉动作模型 小K动画网-AIGC视频动捕平台 地址:https://xk.yunbovtb.com/ 需要注册 生成的FBX文件,不能直接导入到blender中, 方法有2种: 第一种:需要转换一下&#x…...
掘金滑块验证码安全升级,继续破解
去年发过一篇文章,《使用前端技术破解掘金滑块验证码》,我很佩服掘金官方的气度,不但允许我发布这篇文章,还同步发到了官方公众号。最近发现掘金的滑块验证码升级了,也许是我那篇文章起到了一些作用,逼迫官…...
数据结构练习题——Java实现
20240531-时间复杂度 1、消失的数字 方法一:位运算 两个数字一样的数组,其中一个数组中少了一个数字,定义一个变量分别异或两个数组,结果即为缺少的数字 class Solution {public int missingNumber(int[] nums) {int xor 0;int…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
