Binder机制详解(三)

Binder相关面试总结(三):Binder机制是如何跨进程的 ServiceManager 和其他进程同样采用 Bidner 通信,ServiceManager 是 Server 端,有自己的 Binder 实体,其他进程都是 Client,需要通过这个 Binder 的引用来实现 Binder 的注册,查询和获取。对于进程之间来说,用户空间的数据不可共享,内核空间的数据可共享,为了保证安全性和独立性,一个进程不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的,这就需要跨进程之间的数据通信方式。Binder框架 是基于 C/S 架构的。 阅读详情

系列目录

Binder机制详解(一)

Binder机制详解(二)


前言

前两节学习了Binder机制需要储备的底层知识,接下来会分四层详细讲解Binder机制


一、Binder机制理解

binder 是 Android 中主要的跨进程通信方式,binder 驱动和 service manager 分别相当于网络协议中的路由器和 DNS,并基于 mmap 实现了 IPC 传输数据时只需一次拷贝。

binder 包括 BinderProxy、BpBinder 等各种 Binder 实体,以及对 binder 驱动操作的 ProcessState、IPCThreadState 封装,再加上 binder 驱动内部的结构体、命令处理,整体贯穿 Java、Native 层,涉及用户态、内核态,往上可以说到 Service、AIDL 等,往下可以说到 mmap、binder 驱动设备,是相当庞大、繁琐的一个机制。

二、应用层

1.Linux下的进程通信

  • 管道通信:1v1,两次拷贝

  • socket:效率低,开销大

  • 共享内存:性能高,安全性低

2.binder通信

binder通信:牺牲了开发灵活度,必须实现一个service,自己实现数据分发(通信的类,方法,数据,返回参数)—>aidl帮我们做

  • aidl.exe解析aidl配置类,生成一个java类

  • 写完AIDL文件之后,系统会在Build时生成一个继承IInterface接口的java文件。这个文件名和对应的AIDL文件名相同。在这个文件中,有一个内部类Stub,这个类就是Binder,所以可以认为AIDL是为了帮助系统生成对应的Binder文件。

  • 这个类继承了IInterface接口,同时这个类也是一个接口。这个接口申明了两个方法,也就是.aidl中的方法。然后声明了一个内部类Stub。这个Stub就是一个Binder类。在Stub内部还有个代理类Proxy,在跨进程通讯中,它会是客户端的代理方法。

proxy调用者,stub接收者

3.stub

  • 除去构造方法以外,Stub中的方法还有asBinder()、asInterface()和onTransact方法。在这三个方法之外,还有上文提到过的,两个静态ID,用来标识客户端调用的方法。

  • 其中asBinder()方法相当于一个get方法,用来返回当前的Binder对象

  • 接下来我们看一下onTransact()方法,这个方法运行在服务端,会通过code来分发具体要执行的方法(避免方法乱套)

  • asInterface()方法:判断当前服务端和客户端是否处于同一进程中。如果处于同一个进程中,会返回同一个Stub对象本身,如果处于不同的进程会返回封装后的客户端代理类Stub.proxy。这个方法会在客户端调用,用来获取对象。

4.流程总结

客户端—>proxy中请求函数—>通过remote写入(code,data,返回值,类)—>mRemote—>transact(JNI层实现)写入到系统中—> 通知服务端进程—>onTransact通过code—>调用服务端request—>结果—>写入客户端进程

三、native层

进程间通信本质:内存拷贝

  • 用户空间:存放程序的代码和数据

    内核空间:存放内核代码数据

    应用程序需接口申请才能调用代码在内核空间中运行,好处:应用程序崩溃不会导致内核崩溃

    计算机蓝屏主要是硬件驱动(在内核空间)不兼容导致

  • 物理内存

    虚拟内存:用户空间和内核空间都属于虚拟内存

  • MMU内存管理单元:cpu想要访问一个地址,通过MMU(PTE表)去取

    CPU在执行指令与数据时,获得的是虚拟内存的地址,但是CPU只能去物理内存寻址。此时,MMU就派上用场了。MMU负责,将虚拟地址,翻译成,真正运行时的物理地址。

1.Binder基于mmap如何实现一次拷贝

(binder驱动)内核空间和(接收方进程)用户空间映射到同一块物理内存上
发送方进程copy_from_user—>Binder驱动(内核空间)<—>mmap映射物理页alloc_page,接收方进程<—>mmap映射物理页alloc_page

  • 内核刚开始只是分配了一个物理页,并且分别将这个物理页映射到进程的内核虚拟地址空间V1(修改内核空间的页表映射)和进程的用户虚拟地址空间V2(修改用户空间的页表映射)。在用户空间访问V1和在内核空间访问V2,其实都是访问的是同一个物理内存块,从而实现进程的内核和用户空间共享同一块物理内存的目的。这样binder驱动在内核空间,将一段数据拷贝到这个物理页,则该进程的用户空间则不需要copy_to_user()即可以同步看到内核空间的修改,并能够访问这段物理内存

2.Intent传参大小限制

4M,mmap映射时会判断大小

初始化binder—>binder_open(路径)—>mmap映射—> binder_loop不断解析分发物理内存中数据

四、驱动层

service manager(单独进程):运行binder,实现android进程间通信,父进程是init进程

  • init—>service manager

  • init—>zygote—>systemServer

copy_from_user:用户空间拷贝到内核空间(驱动)

Binder驱动核心是维护一个binder_proc类型的双向链表,里面记录了servicemanager在内的所有service信息,当client去请求某个service时,binder驱动去binder_proc中查找相应的service返回给client,同时增加service的引用个数

binder相关类及成员函数介绍 1.1.1 IInterface类 (1) 定义:  class IInterface : public virtual RefBase { public:             IInterface();             sp         asBinder();             sp   asBinder() const;              阅读详情

相关推荐

Binder机制原理解析

Binder机制原理解析 前言 我们都知道Android应用程序由Activity、Service、Broadcast Receiver、Content Provider四大组件构成的,他们可能运行在不同进程中,还有Android系统中还有各种服务,例如Actiivty管理服务ActivityManagerService、电源管理服务PowerManagerService、显示管理服务DisplayManagerService、包管理服务PackageManagerService等服务,这些服务在都在系统进

刘信的博客 1787

binder中的asInterface和asBinder

在binder的封装里,接口类如IPowerManager(stub,proxy)里包装了IBinder对象, 封装方法中提供了asInterface来根据IBinder来构造接口对象,如 IPowerManager adapter = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); 同时,接口对象中可...

aaajj的专栏 7780

Binder机制详解

Binder是什么?Binder的原理;Binder运行机制;Binder通信的四个角色;Binder驱动;Binder通信模型;为什么使用Binder?

是阿超 2117

AIDL关键点

关键是bindService的前两个参数例如上面图片中的 getServiceVersionCode() 等方法。

u012551120的博客 463

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

本文详细介绍了如何使用SpannableStringBuilder在Android平台上构建专业级AI对话界面,涵盖流式文本处理、富文本解析、交互优化等核心技术。通过实战代码示例,帮助开发者实现类似DeepSeek的AI产品交互效果,提升用户体验和应用专业度。

weixin_28358083的博客 198

64.qt quick-qml使用高德地图插件实现V2版本(新增:位置搜索、路径规划、轨迹编辑等)

qt quick-qml高德地图插件(新增:位置搜索、路径规划、轨迹编辑等) Qt地图插件,使用简单方便,不用浏览器内核,运行高效迅速 跨平台支持,(Qt Windows(MinGW, MSVC)\Linux(桌面、嵌入式)\Android\IOS\等) 在线更新瓦片地图下载,并且支持缓存保存离线地图实现.........

抵抗时间扭曲,坚持做一件有意义的事 6129

Linux的IPC机制(三):Binder

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

m0_60388292的博客 1333

SAP-ABAP:SAP IDOC 全面学习指南

SAP-ABAP:SAP IDOC 全面学习指南

baidu_35680696的博客 1616

Binder机制全解(三)Binder 内存映射

    Binder机制牵涉到进程的内核空间地址和用户空间地址,所以这里先简单介绍一下Linux进程中的内存管理的概念。内存通常被组织为一个由N个连续的字节大小的单元组成的数组,每个字节都有一个唯一的物理地址,作为到数组的索引。CPU访问内存最简单直接的方法就是使用物理地址,这种寻址方式被称为物理寻址。但是,在现代操作系统中,处理器使用的是一种称为虚拟寻址的寻址方式。使用虚拟寻址,CPU在获得虚拟...

appdsn的博客 2650

(ICLR 2025)【源码讲解+复现】TIMER-XL: Long-Context Transformers for Unified Time Series Forecasting

本文提出了一种统一的多变量时序预测模型Timer-XL,其核心创新包括:1)采用自回归解码器架构,将多变量时序预测统一为next-token预测问题;2)设计TimeAttention机制,通过相对位置编码和因果掩码捕获时序位置和变量间交互;3)支持长上下文预训练以提升零样本迁移能力。模型架构包含嵌入层、时间感知注意力块和预测头,采用MSE损失进行端到端训练。实验表明该方法在多种时序任务上表现优异,特别是在长跨度预测和少样本场景下。代码实现提供了完整的模型定义、数据加载和训练流程,支持自定义配置参数。

1146

PreScan快速入门到精通第二十一讲驾驶员模型之驾驶员在环

请注意,操纵杆的输出角度是以度为单位的,而方向盘执行器希望其输入是以弧度为单位的。当选择一个支持的方向盘时,PreScan会自动将按钮映射到正确的功能上(如换挡),并设置轴的正确范围(如转向角度)。该系统中的所有其他组件都是为了提供正确的按钮映射,并为所选的方向盘设置正确的范围。对于每一个额外连接的控制器,它们的ID会增加一个,例如第二个控制器的设备ID为1,第三个控制器的设备ID为2,等等。由于所有的方向盘最初放在编译表上的设备ID都是0,所以用户应该先进行正确的调整,将每个控制器设置为正确的设备ID。.

小明师兄的博客 1423

Android Binder通信机制学习(三)

新人阿彡的Android多媒体学习之路 🚄🚄🚄 第一章 Android Binder通信机制学习之Binder基本原理 🚄🚄🚄 第二章 Android Binder通信机制学习之Binder基本架构 🚄🚄🚄 第二章 Android Binder通信机制学习之ServiceManager启动流程 本章目录新人阿彡的Android多媒体学习之路0、前言1、Binder整体架构、参考资料 0、前言 主要参考:https://wenku.baidu.com/view/e63bd6dd0a75f46527d3240c

李清的博客 1380

从零玩转Vitis裸机开发:手把手教你创建、移植与实战优化

✅ Vitis裸机开发全流程✅ 中断系统配置技巧✅ 跨平台移植方法论✅ 性能优化实战经验研究FreeRTOS移植探索AMP(非对称多处理)架构学习使用Vitis Analyzer进行性能分析技术雷达:关注Xilinx最新推出的Vitis Unified IDE,其集成了更强大的调试和分析工具。立即动手实践吧!

QQ_778132974的博客 584

Android Binder【篇三:透视 Framework Java 通信机制】

Binder是Android系统提供的一种IPC( 进程间通信) 机制,在Java层中如果想要利用Binder进行跨进程的通信, 也得定义一个类似ITest的接口,不过这是一个aidl文件。阿斗(aidl的谐音) 本来是扶不起的, 可是我们有了AIDL工具,就有可能将他扶起!即AIDL是Binder系统面向Java层的一种实现机制。 参考:Android中AIDL的使用详解 一、AIDL简单演示 AIDL是Android中IPC(Inter-Process Communication)方式中的一...

qq_27672101的博客 2751

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 506

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android Binder机制(三) ServiceManager守护进程

Android Binder机制(三) ServiceManager守护进程 http://wangkuiwu.github.io/2014/09/03/Binder-ServiceManager-Daemon/  首页博客链接关于我留言板 ServiceManager是用户空间的一个守护进程,它一直运行在后台。它的职责是管理Binder机制中的各个Server。当Server启

CCJHDOPC的专栏: 1054

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: Binder机制详解(二)
下一篇: 自定义view实现半圆弧进度条
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值