当前位置: 首页 > article >正文

【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 等后台线程。

后续继续补充。。。

相关文章:

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

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)&#xff1f; 众所周知&#xff0c;Android系统基于Linux开发&#xff0c;Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…...

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上

题目&#xff1a;1731. 每位经理的下属员工数量 题解&#xff1a; select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…...

资产智慧管理安全监测中心

在数字经济高速发展的今天&#xff0c;资产管理的智能化已成为企业降本增效的核心竞争力。从智慧园区到古建筑群&#xff0c;从交通枢纽到城市电网&#xff0c;资产智慧管理安全监测中心正以物联网、人工智能、数字孪生等技术为支撑&#xff0c;构建起资产全生命周期的“智慧大…...

从零开始的云计算——番外实战,iptables防火墙项目

目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网&#xff0c;但是无法ping到内部网关。 ​编辑​编辑 2内部网络服务器s1通过DN…...

移动网页调试的多元路径:WebDebugX 与其他调试工具的组合使用策略

在移动端网页开发中&#xff0c;仅靠一款工具很难覆盖所有调试场景。不同问题类型需要不同的调试维度——有时是网络请求&#xff0c;有时是 DOM 样式&#xff0c;有时是 JS 状态&#xff0c;有时是性能瓶颈。 本文以“多工具协作”为核心思想&#xff0c;结合多个项目经验&am…...

【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)

目录 方法一&#xff1a; 方法二 1.双击"package”即可进行打包呈jar 2.双击后就会自动打包生成jar了&#xff0c; 生成的jar在这个目录下 3.右击&#xff0c;点击“复制路径/引用”&#xff0c;即可获得“绝对路径”、“根路径”等相关信息 前提&#xff1a; 在pop.…...

【HarmonyOS 5】鸿蒙HarmonyOS —(cordova)研发方案详解

Android、Ios 和 HarmonyOS APP研发分析 Android研发语言Java、Ios研发语言objective-c, HarmonOS研发语言ArkTs和C/C&#xff0c;写了第一句&#xff0c;就会有人反驳&#xff0c;Android和Ios也支持C/C语言&#xff0c;封装成动态库so&#xff0c;然后调用就可以了&#xff0…...

Linux程序运行日志总结

在Linux系统中,程序运行时产生的日志记录主要通过以下几种方式实现,这些日志有助于排查问题、监控系统行为或审计安全事件: 1. 系统日志(System Logs) 存放路径:通常位于 /var/log/ 目录下。常见日志文件: /var/log/syslog 或 /var/log/messages:通用系统日志(取决于发…...

【物联网-TCP/IP】

物联网-TCP/IP ■ TCP/IP■■■ 添加链接描述 ■ TCP/IP ■ ■ ■...

SAP ECC 与 SAP S/4HANA 技术架构全面对比

SAP ECC 是过去几十年众多企业核心业务系统的基石&#xff0c;涵盖财务、物流、制造等关键领域。然而&#xff0c;随着数字化转型的加速和企业需求的增长&#xff0c;其架构日益显现局限。因此&#xff0c;SAP 推出了新一代 ERP 解决方案——SAP S/4HANA。它不仅在功能上做出优…...

Halcon光度立体法

1、光度立体法&#xff0c;可用于将对象的三维形状与其二维纹理&#xff08;例如打印图像&#xff09;分离。需要用不同方向而且已知照明方向的多个光源&#xff0c;拍摄同一物体的至少三张图像。请注意&#xff0c;所有图像的相机视角必须相同。 物体的三维形状主要被计算为三…...

cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能

在使用oops框架的过程中&#xff0c;它的导出数据并生成数据结构的插件oops-plugin-excel-to-json有些小的坑点&#xff0c;为满足我个人习惯&#xff0c;对此部分进行了一个小的修改&#xff0c;有需要的拿去用&#xff0c;记录下供大家参考&#xff1b; 一、配置&#xff1a;…...

Spring Boot + OpenAI 构建基于RAG的智能问答系统

一、技术架构设计 1.1 系统架构图 [前端]│▼ (HTTP/REST) [Spring Boot Controller]│▼ (Service Call) [问答处理服务层]├─▶ [知识库检索模块] ──▶ [向量数据库]└─▶ [OpenAI集成模块] ──▶ [OpenAI API]│▼ [结果组装与返回] 1.2 技术选型 组件技术栈版本要求…...

开源量子模拟引擎:Quantum ESPRESSO本地部署教程,第一性原理计算轻松入门!

一、介绍 Quantum ESPRESSO 是一个用于电子结构计算和纳米尺度材料建模的开源计算机代码集成套件&#xff0c;专门用于进行第一性原理&#xff08;第一性原理&#xff09;计算&#xff0c;涵盖了电子结构、晶体学和材料性能的模拟。 Quantum ESPRESSO GPU 版本支持GPU加速&am…...

算法blog合集

https://zhuanlan.zhihu.com/p/600245782 https://zhuanlan.zhihu.com/p/696212679 https://zhuanlan.zhihu.com/p/291406172 【推荐系统】DSSM双塔召回2_pair-wise训练和推理-CSDN博客 精通推荐算法1&#xff1a;为什么需要推荐系统&#xff08;系列文章&#xff0c;建议收…...

每日八股文6.3

每日八股-6.3 Mysql1.COUNT 作用于主键列和非主键列时&#xff0c;结果会有不同吗&#xff1f;2.MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;OUTER JOIN&#xff09;有什么主要的区别&#xff1f;3.能详细描述一下 MySQL 执行一条查询 SQL 语句的…...

Kubernetes (k8s)版本发布情况

Kubernetes (k8s)版本发布情况 代码放在 GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management https://github.com/kubernetes/kubernetes/releases 文档放在 kubernetes.io各个版本变更等: https://github.com/kubernetes/kubernet…...

QT 5.9.2+VTK8.0实现等高线绘制

项目下载链接&#xff1a;QT5.9.2VTK8.0实现等高线绘制资源-CSDN文库 示例如下&#xff1a; 主要代码如下&#xff1a; #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkPo…...

CppCon 2015 学习:3D Face Tracking and Reconstruction using Modern C++

1. 3D面部追踪和重建是什么&#xff1f; 3D面部追踪&#xff08;3D Face Tracking&#xff09;&#xff1a; 实时检测并追踪人脸在三维空间中的位置和姿态&#xff08;如转头、点头、表情变化等&#xff09;&#xff0c;通常基于摄像头捕获的视频帧。3D面部重建&#xff08;3D…...

Three.js进阶之音频处理与展示

引擎在对音频处理提供了丰富的接口&#xff0c;本文展示两个音频处理示例。 一、声音可视化 Three.js中的声音可视化是以视觉为核心&#xff0c;以音乐为载体&#xff0c;为音乐提供直观的视觉呈现。通过对音乐数据的分析并结合开发需求&#xff0c;能实现酷炫的视觉效果。在…...

4.2 HarmonyOS NEXT分布式AI应用实践:联邦学习、跨设备协作与个性化推荐实战

HarmonyOS NEXT分布式AI应用实践&#xff1a;联邦学习、跨设备协作与个性化推荐实战 在HarmonyOS NEXT的全场景分布式架构下&#xff0c;AI能力突破设备边界&#xff0c;通过联邦学习保护数据隐私、跨设备任务协作释放算力潜能、个性化推荐实现服务主动化。本文结合华为分布式…...

兼容老设备!EtherNet/IP转DeviceNet网关解决储能产线通讯难题

在新能源行业飞速发展的当下&#xff0c;工业自动化水平的高低直接影响着企业的生产效率与产品质量。JH-EIP-DVN疆鸿智能ETHERNET/IP和DEVICENET作为工业领域常用的通信协议&#xff0c;它们之间的转换应用在新能源生产线上发挥着关键作用。本文重点探讨ETHERNETIP从站转DEVICE…...

健康检查:在 .NET 微服务模板中优雅配置 Health Checks

&#x1f680; 健康检查&#xff1a;在 .NET 微服务模板中优雅配置 Health Checks &#x1f4da; 目录 &#x1f680; 健康检查&#xff1a;在 .NET 微服务模板中优雅配置 Health Checks一、背景与意义 &#x1f50d;二、核心配置 &#x1f527;2.1 引入必要的 NuGet 依赖 &…...

【Pytorch学习笔记】模型模块08——AlexNet模型详解

AlexNet模型详解&#xff1a;结构、算法与PyTorch实现 一、AlexNet模型结构 AlexNet是2012年ImageNet竞赛冠军模型&#xff0c;由Alex Krizhevsky等人提出&#xff0c;标志着深度学习在计算机视觉领域的突破。 网络结构&#xff08;5卷积层 3全连接层&#xff09;&#xff…...

LabVIEW自感现象远程实验平台

LabVIEW开发自感现象远程实验平台&#xff0c;通过整合 NI数据采集设备、菲尼克斯&#xff08;Phoenix Contact&#xff09;继电器模块及罗技&#xff08;Logitech&#xff09;高清摄像头&#xff0c;实现远程数据采集、仪器控制与实时监控三大核心功能。平台突破传统实验装置局…...

AppTrace 视角下 App 一键拉起:提升应用转化率的高效方案​

官网地址&#xff1a;AppTrace - 专业的移动应用推广追踪平台 在大规模开展 App 推广、用户召回、广告投放、邀请传播等活动时&#xff0c;高效的深度链接方案至关重要。它不仅能缩短用户路径&#xff0c;带来无缝、流畅的跳转体验&#xff0c;更核心的是通过参数传递打通 web…...

梯度下降:机器学习优化的核心算法

梯度下降算法原理及其在机器学习中的实践应用 引言 在机器学习领域,优化算法扮演着核心角色。其中梯度下降法作为最基础的优化方法,为神经网络、支持向量机等模型提供了参数优化解决方案。本文将深入解析梯度下降的数学原理,探讨其多种变体实现,并通过Python代码演示具体…...

Vue-6-前端框架Vue之基于Plotly.js绘制曲线

文章目录 1 安装Plotly.js2 折线图2.1 创建一个Vue组件来绘制图表2.1.1 Vue模板部分template2.1.2 Vue脚本部分script2.1.3 Vue样式部分style2.2 使用这个组件APP.vue3 动态更新图表3.1 创建一个Vue组件来绘制图表3.1.1 Vue模板部分template3.1.2 Vue脚本部分script3.1.3 Vue样…...

Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 标题&#xff1a;YOLOv3: An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 机构&#xff1a;华盛顿大学&#xff08;University of Washington&#xff09; 发表时间&#xff1a;2018年 代…...

Redux:不可变数据与纯函数的艺术

Redux&#xff1a;不可变数据与纯函数的艺术 状态管理的困境 随着现代 Web 应用功能的不断扩展&#xff0c;前端开发者面临着日益复杂的状态管理挑战。当应用从简单的表单交互发展到复杂的单页应用时&#xff0c;组件间共享状态的问题变得尤为突出。想象一个电商平台&#xf…...