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

相关新闻

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

网络安全(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/11/13 4:10:54 阅读更多 →
超级详细的 FinalShell 安装 及使用教程

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

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

2026/11/10 2:59:54 阅读更多 →
ENVI5.6 安装教程,新手入门(超详细)附安装包和常见问题

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

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

2026/11/10 2:59:54 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/12 5:00:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/12 5:13:20 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/12 5:13:20 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/12 5:13:20 阅读更多 →

日新闻

周新闻

月新闻