Android - Binder机制 - ProcessState和IPCThreadState

Android 进阶——Binder IPC之Native家族成员驱动通信桥梁IPCThreadState 详解(七) 无论是BpBinder还是BnBinder,都是通过IPCThreadState和Binder 驱动程序通信的,换言之,Server进程是通过Binder库(客户端与服务端)的IPCThreadState 来处理与Binder驱动的协议的,类似Socket通信一样,IPCThreadState的代码一部分给客户端使用,一部分给服务端使用。 阅读详情

以下几篇文章是较深入分析binder机制。

目录

1. Android - Binder机制 - ServiceManager

2. Android - Binder机制 - 普通service注册

3. Android - Binder机制 - 获得普通service

4. Android - Binder机制 - client和普通service交互

5. Android - Binder机制 - Binder框架总结

6. Android - Binder机制 - ProcessState和IPCThreadState

7. Android - Binder机制 - 驱动

Android - Binder机制 - ProcessState和IPCThreadState

IPCThreadState看上去复杂

初看IPCThreadState代码一头雾水,之所以复杂,是因为IPCThreadState的代码一部分给客户端使用,一部分给服务端使用,两个一掺杂,所以就乱了。如socket编程,客户端和服务端有很多一样的操作(如打开socket、read、write、close等),也有一些不一样的操作(如服务端多了listen和accept,客户端多了connect),如果我们将服务端和客户端的代码写在一起,如果你不懂socket编程,肯定会觉得很复杂。但是,如果我们先定义一个基类来完成服务端客户端相同的操作,然后再创建两个继承类,分别执行服务端和客户端不一样的操作,相信这样让程序员一眼就能看出其中的关系。IPCThreadState就是因为将服务端和客户端写在了一起,所以显得比较复杂。
IPCThreadState主要的函数有sendReply、waitForResponse、joinThreadPool、transact、talkWithDriver、writeTransactionData、executeCommand等。下面我们分析IPCThreadState的服务端和客户端的流程和使用了上面哪些主要函数,你会发现这些大部分函数或者只为客户端使用或者只为服务端使用。


服务端

Socket服务端一般要进行哪些操作呢?

初始化
打开一个socket,bind要监听的端口号和ip地址
变为服务端
执行listen,一个普通(默认是客户端)的socket就变为了服务端
监听
执行accept
接收数据
recv数据
处理数据
根据业务进行相关处理
反馈数据
Send数据
关闭
执行Close


相应的binder如何处理一个服务端呢?

初始化
打开binder设备,如sp<ProcessState> proc(ProcessState::self())里执行了open_binder函数。
变为服务端
执行AddService,如CameraService::instantiate()
监听
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
这俩其实都是起监听的作用,binder不像socket只有一个监听,binder可以支持很多监听线程,ProcessState::self()->startThreadPool()其实也是调用的IPCThreadState::self()->joinThreadPool()。joinThreadPool里循环调用talkWithDriver,该函数其实就是扫描设备是否有数据。
接收数据
接收数据和监听是在一起的,这里其实很像UDP的socket编程,UDP是没有accept步骤的。
反馈数据
executeCommand对各种指令进行处理,该函数会在后面详解。
executeCommand处理的时候有些需要反馈的数据写到mOut缓冲,那什么时候发送mOut的数据呢,其实还是joinThreadPool的talkWithDriver,也就是在这可以看出joinThreadPool同时干两个事,一个是接收数据,一个是发送数据。
关闭
Close(mProcess->mDriverFD)


客户端

Socket客户端一般要进行哪些操作呢?

初始化
打开一个socket
连接服务端
执行connect
发送请求
send数据
接收反馈
recv数据
关闭
执行Close


相应的binder如何处理一个客户端呢?

初始化
打开binder设备,如camera客户端在哪打开的呢,看看getCameraService函数里面为了获得服务,先获得ServiceManager的函数defaultServiceManager(),该函数执行了ProcessState::self()->getContextObject(NULL),ProcessState::self()就会打开binder设备。
连接服务端
执行GetService,通过ServiceManager获得了服务的Handle,以后就是靠这个Handle和服务端打交道的,就想socket的整数句柄。另外,客户端业务层并不直接使用Handle,而使用了Bpxxx,它是服务端在客户端的代理(只是为了客户端写代码更方便)。
发送请求
执行remote()->transact,而实际是执行的IPCThreadState::transact,该函数又执行了writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL),该函数将要发送的数据先写入到发送缓存(mOut),又一次注意参数handle,它指定哪个服务端来处理。真正的发送是在waitForResponse(reply)的talkWithDriver。
接收反馈

接收也是在waitForResponse(reply)的talkWithDriver函数。

talkWithDriver将需要发送的请求buf和接收buf(即binder_write_read bwr)同时送入binder驱动,请求和发送是一个堵塞过程(ioctrl(binder_fd, BINDER_WRITE_READ, &bwr))。

关闭
执行Close



Binder机制-IPCThreadState过程 阅读详情

相关推荐

Android 进阶——Binder IPC之Native家族成员Binder设备操作类ProcessState详解(八)

ProcessState 继承自RefBase,ProcessState在同一进程内是唯一的,主要用于初始化Binder设备(即打开binder设备文件/dev/binder节点)并将设备文件映射到进程的地址空间。Binder线程池中的每一个线程都可以通过它与Binder驱动程序建立连接。

最美不过,心中有梦,身旁有你! 2218

C++层Binder——IPCThreadState

C++层Binder——IPCThreadState   Binder服务端可以自动相应客户端的请求,其底层必然是有对应的线程来支撑它的运行的,而在Binder的服务端里,确实是有一个线程池来支持Binder服务端的运行,我们使用top指令看线程状态,可以看到很多线程名带有Binder字样的就是这个线程池中开辟的Binder线程。   还是以cameraservice为例子。我们知道cameraservice是一个独立进程,而独立进程必然是有一个main函数作为进程的入口函数的。cameraservice的

qq_38401088的博客 1596

细读《深入理解 Android 内核设计思想》(四)Binder 机制 [中]

对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版 智能指针 binder 驱动中的结构体 ProcessState IPCThreadState BpBinder BinderProxy ServiceManager getService 流程 智能指针 在 binder 相关源码可以看到 sp、wp 类型的引用: sp<IBinder> result = new...

yhao的博客 1025

IPCThreadState

IPCThreadState 在Android中,每个参与Binder通信的线程都会有一个IPCThreadState实例与之关联。我最开始接触到这个类是在BpBinder::transact方法中。 transact 其就是调用的IPCThreadState::transact来完成的数据传输工作,其工作可以分为两步: 发送数据 实际上,writeTransactionData只是将数据转换成binder_transaction_data结构并重新写入到IPCThreadState::mOut中。

liuzhengzlh的博客 1402

构造地貌研究入门:手把手教你用ArcGIS插件CalHypso分析流域地貌形态

本文详细介绍了如何使用ArcGIS插件CalHypso进行流域地貌形态分析,包括工具安装、数据预处理、HI曲线生成及结果解读等关键步骤。通过实战操作,帮助读者掌握面积高程积分(HI)曲线的应用技巧,为构造地貌研究提供量化工具。

weixin_33704234的博客 105

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

Android开发之ProcessState和IPCThreadState类分析

Android开发之ProcessState和IPCThreadState类分析

hggjgff的博客 506

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

Rust 在数据科学家中的普及将受到 Polars 的推动,用户会发现从使用 Python 切换到 Rust API 的门槛相对较低——比从 Pandas 切换到 C 的门槛要低得多!在数据科学蓬勃发展的十年里,我所在领域的日常工作主要由像 Python 这样的动态语言或像 R 和 Julia 这样使用即时编译的语言主导。尽管这两个库的功能有很多重叠,但有些人会想要一个像 DuckDB 这样的工具,它拥有更多关系型数据库的陷阱,而有些人则不会。然而,一位受访者正确地指出,基于GPU的库(如cuDF)更快。

sosogod的博客 2466

Binder进程与线程ProcessState以及IPCThreadState

ProcessState以及IPCThreadState ProcessState是负责打开Binder节点并做mmap映射,IPCThreadState是负责与Binder驱动进行具体的命令交互。 ProcessState 实现ProcessState的主要关键点有以下几个: 保证同一进程只有一个ProcessState实例,且只有在ProcessState对象建立时...

weixin_30906185的博客 401

ComfyUI入门学习-教程篇

深入的 ComfyUI 教程,不同功能节点的详细指南。一个比较有意思的Comfyui教程,动画式学习。从安装到基础教程、高级教程再到各种工作流。非常全面,有教程有搭建好的工作流。

wincyfu的博客 1326

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。

山云的专栏 2068

Android5.0中Binder相关的ProcessState和IPCThreadState的认识.

文章仅仅用于个人的学习记录,基本上内容都是网上各个大神的杰作,此处摘录过来以自己的理解学习方式记录一下。     个人最为认可和推崇的大神文章:           http://blog.youkuaiyun.com/luoshengyang/article/details/6618363     罗升阳Binder系列文章           http://blog.youkuaiyun.com/i

宇你有缘 1136

亲测解决This application failed to start because no Qt platform plugin could be initialized.

这个问题是由于环境变量改变或者Qt的路径改变导致,解决办法是在环境变量里面重新添加Qt路径。

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 2920

Android Binder 详解(3)

ProcessState 和 IPCThreadState 是 Binder 通信的 “底层支撑框架”—— 它们隐藏了驱动交互的复杂细节(如 open、mmap、ioctl),让 BBinder 和 BpBinder 只需专注于 “业务逻辑实现” 和 “请求转发”,无需关心底层资源管理和线程调度。 理解这两个类的核心作用,就能明白 Binder 通信是如何 “跨进程”“跨线程” 高效协作的,也能更好地排查 Binder 相关的问题(如线程池阻塞、驱动 fd 泄露、死亡通知未触发等)。

weixin_42065195的博客 753

【异常】Claude CLI / Claude Code 命令行工具 “claude 不是内部或外部命令“ 报错完整解决方案

摘要:Windows系统执行Claude命令报错"'claude'不是内部或外部命令",主要原因是环境变量配置问题。解决方案包括:1)通过npm全局安装时需加-g参数并重启终端;2)检查Node.js环境及npm全局路径是否加入系统PATH;3)对于Claude Code独立安装版,需手动添加.local/bin路径到环境变量。常见错误包括安装不完整、权限不足或路径未自动配置,按照对应场景排查即可解决。

奶爸的编程之路,也就一周冷个三天 7813

【史上最全面esp32教程】oled显示篇

esp32-arduino Oled屏幕的使用

m0_62599305的博客 1万+

Binder中的ProcessState和IPCThreadState分析

ProcessState和IPCThreadState最为binder通信的基础,我们从MediaPlayer来开始分析这两个类

编程菜鸟---正在努力进阶 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深入理解Binder机制

Binder概述   Binder其前身是由Be Inc.和Palm,Inc.开发的OpenBinder,而后Google将其带入Android系统作为主要的跨进程通信技术使用。Binder之所以能被Google青睐跟其优越的传输性能及安全性能是分不开的。在传输性能上,传统的linux系统IPC如Socket、管道、消息队列等在跨进程传输时数据会被拷贝2次,而Binder则利用mmap只需一次拷贝...

乌啼夜的酒痕 2684

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

想掌握Android面试官必问的 Binder 机制?那别想绕开 Binder 驱动源码分析!

分析这三个关键函数前,先来看下它们是如何被上层调用的,这样对 binder 机制有整体的了解,才不至于对 binder 驱动的理解太过孤立。binder 驱动在系统内核中,从用户空间应用程序到内核空间 binder 驱动,会经过一些 ProcessState、IPCThreadState 等中间的操作封装类,然后通过系统调用陷入系统内核。ProcessState 是进程单例,主要负责打开 binder 驱动设备及 mmap。

2401_84148981的博客 659

Android8 binder源码学习分析笔记(三)

本文分析了Android系统Binder驱动的启动过程。在Zygote启动SystemServer进程后,通过nativeZygoteInit()方法调用到ProcessState::self()创建Binder通信环境。关键步骤包括:打开/dev/binder设备文件,通过ioctl获取驱动版本并设置最大线程数,使用mmap映射内核内存空间。这些操作为后续跨进程通信建立了基础,其中ProcessState构造函数负责初始化Binder驱动的核心参数,open_driver方法则完成驱动设备的实际打开和配置

g_i_a_o_giao的博客 2131

掌握 binder 机制?别想绕开 binder 驱动源码分析!

在ProcessState 是进程单例,主要负责打开 binder 驱动设备及 mmap。// 将应用进程虚拟内存空间与 binder 驱动映射,binder_mmap()IPCThreadState 为线程单例,负责与 binder 驱动进行具体的命令通信。在其 talkWithDriver() 方法中,调用了 binder 驱动的 binder_ioctl() 函数:binder 驱动注册binder 驱动运行在内核态,向上层提供 /dev/binder 设备节点,并不对应真实的硬件设备。

2401_84132298的博客 1155
上一篇: Android - Binder机制 - Binder框架总结
下一篇: 编译 - gcc/g++ 使用
G机器猫
博客等级 码龄16年 106粉丝 74原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值