Android Binder通信原理(一):简介

发布时间:2026/10/27 22:22:36

Android Binder通信原理(一):简介 源码基于Android R0. 前言在Linux 系统中现有的进程间通信IPC方式管道(PIPE)在创建时分配一个page大小的内存缓存区大小比较有限命名管道(FIFO)考虑 PIPE_BUF 和原子操作消息队列信息复制两次额外的CPU消耗不合适频繁或信息量大的通信共享内存无须复制共享缓冲区直接付附加到进程虚拟地址空间速度快但进程间的同步问题操作系统无法实现必须各进程利用同步工具解决套接字作为更通用的接口传输效率低主要用于不同机器或跨网络的通信信号量常作为一种锁机制防止某进程正在访问共享资源时其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段信号不适用于信息交换更适用于进程中断控制比如非法内存访问杀死某个进程等0.1 使用Binder 原因0.1.1 性能Socket 作为一款通用接口其传输效率低开销大主要用在跨网络的进程间通信和本机上进程间的低速通信。消息队列和管道采用存储-转发方式即数据先从发送方缓存区拷贝到内核开辟的缓存区中然后再从内核缓存区拷贝到接收方缓存区至少有两次拷贝过程。共享内存虽然无需拷贝但控制复杂难以使用。Binder 只需要一次数据拷贝性能上仅次于共享内存。0.1.2 稳定性Binder 基于 C/S 架构客户端Client有什么需求就丢给服务端Server去完成架构清晰、职责明确又相互独立自然稳定性更好。共享内存虽然无需拷贝但是控制负责难以使用。从稳定性的角度讲Binder 机制是优于内存共享的。0.1.3 安全性Android 为每个安装好的 APP 分配了自己的 UID故而进程的 UID 是鉴别进程身份的重要标志。传统的 IPC 只能由用户在数据包中填入 UID/PID但这样不可靠容易被恶意程序利用。可靠的身份标识只有由 IPC 机制在内核中添加。其次传统的 IPC 访问接入点是开放的只要知道这些接入点的程序都可以和对端建立连接不管怎样都无法阻止恶意程序通过猜测接收方地址获得连接。同时 Binder 既支持实名 Binder又支持匿名 Binder安全性高。2. Binder 划分在Android 8.0 之前Binder机制比较简单只有一个驱动设备/dev/binder,一个守护进行/system/bin/servicemanager一个binder库/system/lib64/libbinder.so.在Android 8.0开始Android引入了Treble的机制为了方便Android系统的快速移植、升级提升系统稳定性Binder机制被拓展成了/dev/binder,/dev/hwbinder/dev/vndbinder。我们原先使用的/dev/binder成为框架进程的专有节点这意味着供应商进程无法再访问此节点。供应商进程可以访问 /dev/hwbinder但必须将其 AIDL 接口转为使用 HIDL。对于想要继续在供应商进程之间使用 AIDL 接口的供应商需要使用 /dev/vndbinder而非 /dev/binder。Android8.0 及之后的Binder域如下图所示3. 三种 binder 介绍3.1 vndbinder 和 bindervnbinder 和binder 使用的是一个ServiceManager 和libbinder只不过在选择的时候会区分open /dev/binder 还是/dev/vnbinderframeworks/native/cmds/servicemanager/main.cpp int main(int argc, char** argv) { if (argc 2) { LOG(FATAL) usage: argv[0] [binder driver]; } const char* driver argc 2 ? argv[1] : /dev/binder; spProcessState ps ProcessState::initWithDriver(driver); ps-setThreadPoolMaxThreadCount(0); ps-setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY); spServiceManager manager new ServiceManager(std::make_uniqueAccess()); if (!manager-addService(manager, manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) { LOG(ERROR) Could not self register servicemanager; } .. }代码中根据参数选择性的将driver 传入进行open详细看ProcessState::initWithDriver() 函数。通常供应商进程不直接打开 Binder 驱动程序而是链接到打开 Binder 驱动程序的 libbinder 用户空间库。为 ::android::ProcessState() 添加方法可为 libbinder 选择 Binder 驱动程序。供应商进程应该在调用 ProcessState、IPCThreadState 或发出任何普通 Binder 调用之前调用此方法。要使用该方法请在供应商进程客户端和服务器的 main() 后放置以下调用ProcessState::initWithDriver(/dev/vndbinder);dev/binder和dev/vndbinder无法在一个进程中同时使用binder和vndbiner 的机制共用一套libbinder因此两者使用时每次只能指定一个设备节点不能同时使用。3.2 hwbinderhwbinder 独立于binder和vndbinder拥有独立的驱动设备/dev/hwbinder独立的hwservicemanager (system/hwservicemanager/ 目录) 和独立的binder 库libhwbinder (system/libhwbinder/ 目录)。android 8.0 以后采用了treble 的架构framework 和HAL 是独立的在不同的 fw 和 HAL 进程中进程间通信使用的是 HIDL 语言而不在使用 AIDL 语言因此使用了不同的 binder 驱动设备3.3 binder 库的变化bindervndbinderhwbinderlib binder 位置frameworks/native/libs/binderframeworks/native/libs/bindersystem/libhwbinderservice manager 位置frameworks/native/cmds/servicemanagerframeworks/native/cmds/servicemanagersystem/hwservicemanager
延伸阅读

更多相关文章

2026/10/27 0:45:32

网络安全(DVWA命令执行漏洞)—代码审计思路

<?php if( isset( $_POST[ Submit ] ) ) { //查看前端传入的post值submit是否为空// Get input $target trim($_REQUEST[ ip ]); //获取get、post、cookie的ip值传参赋值给$target// Set blacklist $substitutions array( //定义数组&#xff…

2026/10/27 9:54:16

超级详细的 FinalShell 安装 及使用教程

一、引言FinalShell 是一款免费的国产的集 SSH 工具、服务器管理、远程桌面加速的良心软件&#xff0c;同时支持 Windows,macOS,Linux&#xff0c;它不单单是一个 SSH 工具&#xff0c;完整的说法应该叫一体化的的服务器&#xff0c;网络管理软件&#xff0c;在很大程度上可以免…

2026/10/27 10:18:06

ENVI5.6 安装教程,新手入门(超详细)附安装包和常见问题

ENVI是一个完整的遥感图像处理平台&#xff0c;广泛应用于科研、环境保护、气象、农业、林业、地球科学、遥感工程、水利、海洋等领域。目前ENVI已成为遥感影像处理的必备软件&#xff0c;包含辐射定标、大气校正、镶嵌裁剪、分类识别、阈值分割等多种功能。ENVI针对绝大部分的…

2026/10/27 22:21:40

C语言冒泡排序:边界推导、优化与泛型实现

冒泡排序在C语言里的地位有点微妙&#xff1a;面试常考、教材必讲、实际项目里却几乎轮不到它上场。可真到要手写的时候&#xff0c;越界、少跑一趟、交换写反、循环变量作用域搞错&#xff0c;这些问题一个接一个冒出来。我带新人做代码审查&#xff0c;见过最多的不是算法写不…

2026/10/27 22:21:40

P3DE三维编辑器架构与性能优化解析

1. P3DE三维场景编辑器核心架构解析P3DE&#xff08;Processing 3D Editor&#xff09;作为基于Processing生态的三维创作工具&#xff0c;其v0.4.8版本在建模工作流和实时渲染性能上实现了显著突破。这个开源编辑器采用Java核心架构&#xff0c;通过扩展Processing的P3D渲染器…

2026/10/27 22:21:40

OpenMontage:用AI代理驱动视频生产,从手工剪辑到可编程工程

1. 从“剪辑软件”到“AI制片厂”&#xff1a;OpenMontage 到底想解决什么问题第一次看到 OpenMontage 这个名字&#xff0c;我下意识以为又是一个套壳的在线剪辑工具。直到把它的定位、关键词和背后的思路捋了一遍&#xff0c;我才意识到这东西的野心根本不在“剪辑”上——它…

2026/10/27 22:21:40

大模型技术演进与核心架构解析

1. 大模型技术演进全景图 过去三年里&#xff0c;大模型技术以惊人的速度迭代更新。从GPT-3的横空出世到如今多模态大模型的百花齐放&#xff0c;这个领域每周都有突破性进展。作为长期跟踪AI前沿的技术从业者&#xff0c;我系统梳理了大模型发展的关键技术节点和演进路径&…

2026/10/27 22:21:40

共享单车大数据架构:HBase+Spark性能优化实践

1. 项目背景与核心需求 共享单车作为城市短途出行的解决方案&#xff0c;每天产生海量的骑行数据。某头部共享单车企业面临以下业务痛点&#xff1a; 每日新增骑行记录超过2亿条 历史数据存储成本以每月15%的速度递增 热数据查询响应时间超过5秒 报表生成耗时长达6小时 我…

2026/10/27 22:16:39

大模型微调技术解析与实战指南

1. 大模型微调的核心价值与应用场景千亿参数大模型正在重塑AI应用开发范式。不同于传统小模型需要从头训练的开发模式&#xff0c;基于大模型的微调技术让开发者能够以极低成本获得领域专家级AI能力。我在金融、医疗、法律等多个行业的实际项目中发现&#xff0c;经过针对性微调…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介&#xff1a;这份PDF是全国计算机二级C语言考试的试题与答案解析&#xff0c;专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介&#xff1a;一份以实战为导向的Python爬虫入门资源&#xff0c;面向具备基本编程基础、希望快速掌握网络数据抓取的初学者&#xff0c;可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档&#xff0c;完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介&#xff1a;这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档&#xff0c;压缩包大小七十八KB&#xff0c;内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开&#xff1a;先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中&#xff0c;设计模式、架构模式、并发模式乃至团队协作模式的选择&#xff0c;往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景&#xff0c;剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天&#xff0c;新手面对最多的困惑往往不是"工具够不够强"&#xff0c;而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径&#xff1a;先从 Ask&#xff08;问答式交互&#xff09;起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑