【Android基础回顾】一:Binder机制是什么?有什么用?

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。

1 什么是进程间通讯机制(IPC)?

众所周知,Android系统基于Linux开发,Linux系统里面本来就有进程间通讯机制。

1.1 Linux的IPC(Inter-Process Communication)概览

它是不同进程之间交换数据和消息的一种手段。

但是进程之间默认地址空间是隔离的,有什么解决方案去做到不同进程之间交换信息吗?答案是当然有。

下图整理自AI。

类型示例特点说明
文件系统相关管道、命名管道(FIFO)简单,适合父子进程或有命名路径的通信
内存相关共享内存高效,速度快,但需自行同步(如用信号量)
消息传递消息队列、信号、信号量安全、结构化,但效率略低
套接字通信本地 Socket、网络 Socket灵活,可跨主机,适用于客户端-服务器架构
高级通信机制DBus、ZeroMQ、gRPC、Binder等抽象层高,适合复杂或跨语言系统

对于这个列表,我们重点是需要关注这些方案的原理是什么。只有知道原理,我们才能解开现象背后的本质,对于很多技术难题,我们才能有思路举一反三。

1.2 文件系统相关(管道、命名管道 FIFO)

这类IPC本质上是一个内核缓冲区,读写操作通过文件描述符来跟缓冲区进行交互。

写端进程通过write写入缓冲区,读端进程通过read读取数据。
这种属于阻塞式通讯,读和写都需要等对方准备好,系统通过文件描述符来判断是否可以进行读和写。

1.3 内存相关(共享内存)

这类IPC,在不同进程的虚拟地址空间通过映射的方式,比如mmap来映射到一段共同的物理内存页来实现“共享”。

进程通过指针直接访问内存中的数据结果,完全绕过了内核的读写接口,所以速度极快。俗称“零拷贝”。这种机制是没有内建锁的,进程需要通过锁机制等保证并发安全。

1.4 消息传递类(消息队列、信号、信号量)

消息队列:内核维护一个消息队列结构体,发送进程通过系统调用把消息copy到内核队列中(第一次拷贝)。接收方从队列中获取信息(第二次拷贝)。

信号:信号是系统内核或者进程向另一个进程发送的异步通知,用来通知某事件的发生。这是一种轻量级的IPC方式。

核心原理是内核使用位图或者信号队列标记进程收到的信号,调度器在合适的时候调用信号处理函数。

信号量:是一种同步原语。本质上是内核中的一个整数值结构 + 等待队列,用于资源访问同步。

P/V 操作中,P(等待)将信号量值减一,若 < 0 进程阻塞;V(释放)加一,并唤醒等待队列中的进程。

1.5 套接字通信(本地 / 网络 Socket)

Linux 为每个 Socket 创建一个 socket 缓冲区结构(sk_buff),内核中维护双向队列。

本地 Socket 使用 UNIX Domain 协议族,数据在内核中传输,无需网络协议栈处理。

网络 Socket 走 TCP/IP 协议栈,数据被封包、路由、拥塞控制,完整链路层处理。

2 Android特有的IPC:Binder

2.1 Binder机制的有什么用?

Binder 是 Android 提供的一种高性能的 IPC 机制,用于实现:

  • 跨进程方法调用(如 A 应用调用系统服务中的方法)
  • 客户端-服务端架构模型
  • 安全的权限校验
  • 引用计数和生命周期管理

2.2 Binder机制为什么快?

可以先看下传统的消息传递类IPC做法。

图片来源:https://blog.csdn.net/carson_ho/article/details/73560642
在这里插入图片描述

而binder通信机制基于内核 Binder 驱动,使用内核内存映射区(Binder Buffer)做 zero-copy 通信。来看下Binder的做法。

图片来源:https://blog.csdn.net/carson_ho/article/details/73560642
来自网络

他的通讯流程是:发送进程 ->内核缓冲区(第一次拷贝) ->映射到接收进程。

2.2 Binder机制由什么组成?

Binder 是一个 C/S 模型(客户端/服务端),主要组成部分如下:

  1. ServiceManager
    系统服务注册与发现的“电话簿”,所有服务通过它注册和查找。

  2. Binder 驱动(Binder Driver)
    位于内核空间(/dev/binder),实现核心的 IPC 逻辑,如数据传输、线程调度、引用计数等。

  3. Binder 本地端(Client 端)
    通过代理类(Proxy)与服务端通信,通常由 AIDL 自动生成。

  4. Binder 服务端(Server 端)
    实现具体的业务逻辑,继承 Binder 类并重写方法。

  5. Binder线程池(Binder线程)
    服务端进程中专门处理来自 Binder 驱动的调用请求的线程(由 BinderThreadPool 管理)。

下面是一个App调用系统AMS的一个例子:

在这里插入图片描述

3 常见问题

3.1 如果超过16个进程同时在使用AIDL进行通讯,会发生什么?

首先,16 并不是硬性限制,“16个进程”来源于 Android Binder 线程池默认上限,它是一个服务端并发处理能力的限制,而不是进程数量的限制。

Android 中,服务端 Binder 对象默认最多有 16 个 Binder 线程(可通过 android.os.Binder.setThreadPoolMaxThreadCount(int) 设置)。

而这个限制影响的是,服务端一次性能并发处理的 Binder 请求线程数。

并不是说客户端数量最多 16 个,而是服务端的同时“处理线程”是 16。

那么如果超过 16 个进程同时通过 AIDL 访问一个服务,会发生什么呢?

  1. 请求不会失败,但需要排队等待,如果服务端的 16 个 Binder 线程都在处理请求,第 17 个及之后的请求将进入等待队列。

  2. 客户端 transact() 系统调用会阻塞,直到服务端有空闲线程。

  3. 服务响应变慢(可观的延迟)。随着并发请求数增加,响应时间线性上升,尤其是服务端执行耗时任务时。比如,图像处理、数据库查询等在主线程处理会导致严重卡顿。

  4. 线程池饱和后,部分请求可能被拒绝(极端情况)。如果服务端主动设置了最大等待队列长度(如基于 ThreadPoolExecutor),也可能在高负载时拒绝新请求(抛出 RejectedExecutionException)。但这取决于服务的实现方式,Binder 驱动本身仍是队列化的。

  5. 主线程阻塞风险,如果服务端是 onTransact() 或处理逻辑运行在主线程上,那么并发调用容易造成 ANR(应用无响应)。Google 明确建议服务端操作应放到 HandlerThread / BinderThreadPool / JobScheduler 等后台线程。

后续继续补充。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言爬虫系列教程5:HTML解析技术以及第三方库选择

Go语言爬虫系列教程5&#xff1a;HTML解析技术以及第三方库选择 在上一章中&#xff0c;我们使用正则表达式提取网页内容&#xff0c;但这种方法有局限性。对于复杂的HTML结构&#xff0c;我们需要使用专门的HTML解析库。在这一章中&#xff0c;我们将介绍HTML解析技术以及如何…

AtCoder 第408​场初级竞赛 A~E题解

A Timeout 【题目链接】 原题链接:A - Timeout 【考点】 模拟 【题目大意】 长老会在 s 秒后睡去,进过 n 次叫醒,长老最后能否是保持清醒。 【解析】 模拟每一次拍击叫醒的过程,查看本次时间距上次时间是否大于 s。注意:第一次拍击叫醒应和 0 秒相减。 【难度】 …

Unity VR/MR开发-VR设备与适用场景分析

视频讲解链接&#xff1a;【XR马斯维】VR/MR设备与适用场景分析&#xff1f;【UnityVR/MR开发教程--入门】_游戏热门视频

MyBatis 查询功能实现全流程

一、创建maven项目 配置好相应的jdk 二、在数据库建立相应的表格 1.因为Mybatis实际是对sql表的一系列操作&#xff0c;所以我们新建一个数据库 2.在查询界面运行下面指令创建一个user表 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(32) NOT NU…

tcp/udp

tcp/udp协议概述 传输层协议基本概念 传输层协议建立在网络层和会话层之间&#xff0c;为应用层实体提供端到端的通信功能&#xff0c;确保数据包的顺序传送及数据的完整性。它利用网络层提供的服务&#xff0c;并通过传输层地址&#xff08;端口号&#xff09;提供给高层用户…

k8s集群安装坑点汇总

前言 由于使用最新的Rocky9.5,导致kubekey一键安装用不了&#xff0c;退回Rocky8麻烦机器都建好了&#xff0c;决定手动安装k8s&#xff0c;结果手动安装过程中遇到各种坑&#xff0c;这里记录下&#xff1b; k8s安装 k8s具体安装过程可自行搜索&#xff0c;或者deepseek; 也…

深入解析 Dotnet-Boxed.Framework:提升 .NET 开发效率的利器

在现代 .NET 开发中&#xff0c;框架和工具的选择对项目的开发效率和长期维护至关重要。Dotnet-Boxed.Framework 是一个开源框架&#xff0c;旨在简化开发流程&#xff0c;提高生产力。它通过一组实用的工具和自动化功能&#xff0c;帮助开发者快速构建高质量的应用程序。本文将…

如何轻松地将文件从 PC 传输到 iPhone?

传统上&#xff0c;您可以使用 iTunes 将文件从 PC 传输到 iPhone&#xff0c;但现在&#xff0c;使用 iTunes 已不再是唯一的选择。现在有多种不同且有效的方法可以帮助您传输文件。在今天的指南中&#xff0c;您可以找到 8 种使用或不使用 iTunes 传输文件的方法&#xff0c;…

Kafka深度解析与原理剖析

文章目录 一、Kafka核心架构原理1. **分布式协调与选举**2. **ISR、OSR与HW机制**3. **高性能存储设计**4. **刷盘机制 (Flush)**5. **消息压缩算法**二、高可用与消息可靠性保障1. **数据高可用策略**2. **消息丢失场景与规避**3. **顺序消费保证**三、Kafka高频面试题精析1. …

【教学类】20250605立体纸盘(3边形-22边形,角度5、10……40,45)

背景需求 在《自助餐》活动中&#xff0c; 【教学类-53-01】20240918自助餐餐盘-CSDN博客文章浏览阅读984次&#xff0c;点赞29次&#xff0c;收藏11次。【教学类-53-01】20240918自助餐餐盘https://blog.csdn.net/reasonsummer/article/details/142340542?spm1011.2415.300…

GC1809:高性能24bit/192kHz音频接收芯片解析

1. 芯片概述 GC1809 是数字音频接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等协议&#xff0c;集成8选1输入切换、低抖动时钟恢复和24bit DAC&#xff0c;适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;动态范围105dB&…

Next.js 中间件鉴权绕过漏洞 CVE-2025-29927

前言:CVE-2025-29927 是一个影响 Next.js 的严重漏洞&#xff0c;源于开发者信任了客户端请求中携带的 X-Middleware-Rewrite 头部字段。攻击者可以手动构造该头部&#xff0c;实现绕过中间件逻辑&#xff0c;访问本应受保护的资源或 API。 影响版本&#xff1a;Next.js < …

第1章 数据分析简介

第1章 数据分析简介 1.1 数据分析 当今世界对信息技术依赖日深,每天产生和存储海量数据,来源于自动检测系统、传感器、科学仪器,以及银行取钱、买东西、写博客、发微博等日常行为。 数据与信息在形式上不同:数据是无形式可言的字节流,难理解其本质;信息是对数据集处理后…

边缘计算网关赋能沸石转轮运行故障智能诊断的配置实例

一、项目背景 在环保行业&#xff0c;随着国家对大气污染治理要求的不断提高&#xff0c;VOCs废气处理成为了众多企业的重要任务。沸石转轮作为一种高效的VOCs治理设备&#xff0c;被广泛应用于石油化工、汽车制造、印刷包装等主流行业。这些行业生产规模大、废气排放量多&…

20250602在Ubuntu20.04.6下修改压缩包的日期和时间

rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 5月 23 10:23 Android13.0地面站.tgz* rootrootrootroot-X99-Turbo:~$ touch 1Android13.0地面站.tgz rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 6月…

windows无法安装到这个磁盘,选中的磁盘采用gpt分区仪式

解决办法&#xff1a; 我才用的是一个网友分享的微软官方解决办法&#xff0c;成功了&#xff0c;但是不知道会不会i有什么影响。将所有分区删掉&#xff0c;这时磁盘变成为分配的空间。我个人是两块固态&#xff0c;一块m.2&#xff0c;一块sata&#xff1b;所以我直接将500g…

使用Composer创建公共类库

概述 如果多个项目中存在使用相同类库、模块的情况&#xff0c;此时可以考虑将类库或者模块单独抽取出来&#xff0c;形成独立类库&#xff0c;通过composer 来进行依赖管理&#xff0c;这样可以更方便维护&#xff0c;大大提升开发效率。 优势 可以对特定模块进行统一维护和…

Ubuntu中TFTP服务器安装使用

TFTP服务器 在 Ubuntu 下使用 TFTP&#xff08;Trivial File Transfer Protocol&#xff09; 服务&#xff0c;通常用于简单的文件传输&#xff08;如网络设备固件更新、嵌入式开发等&#xff09;。 1 TFTP服务器安装 sudo apt-get install tftp-hpa sudo apt-get install…

前端面试总结

1.请做下自我介绍 技术栈 工作经历 2.挑一个项目详细讲一下 介绍了一个项目的业务&#xff0c;重点讲了一个动态表单的实现&#xff0c;从业务、扩展性、可维护性、性能提升 3.场景题&#xff1a;问答怎么做&#xff0c;表单之间关联&#xff0c;回答不同问题跳转到不同的下一个…

Python训练打卡Day38

Dataset和Dataloader类 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 在遇到大规模数据集时&#xff0c;显存常常无法一次性存储所有数据&#xff0c;所以需要使用分批训练的…