定义
Payload Dumper 是一个从安卓 OTA 更新包里的 payload.bin 载荷文件中提取分区镜像的命令行工具,输出结果是可被刷写、修补或分析的原始镜像[3]。它处理的输入可以是本地的 payload.bin、包含该文件的 OTA 压缩包,也可以是提供该文件的网络地址[2]。
这一名称并非某一个程序独有,而是一批功能相近的开源实现的统称。较早的实现是 vm03 用 Python 编写的脚本 payload_dumper.py,后续出现用 Rust 重写的版本、图形界面版本以及可在手机上直接运行的安卓应用版本[4]。
原理
payload.bin 的开头是一段固定的载荷头,前 4 个字节为魔数 CrAU,其后依次记录格式主版本号、清单长度和元数据签名长度[5][6]。头之后是使用协议缓冲(Protocol Buffers)序列化的 DeltaArchiveManifest 清单,再往后是元数据签名、数据块以及末尾的载荷签名[5]。
清单里的每一个分区对应一串安装操作(InstallOperation),操作按类型决定如何生成目标数据。REPLACE、REPLACE_BZ、REPLACE_XZ 分别表示写入原始数据、解压 bzip2 后写入、解压 XZ 后写入;ZERO 表示填充零;SOURCE_COPY 与 SOURCE_BSDIFF 则需要读取旧分区,分别用于整块复制和应用 bsdiff 二进制差分[5][6]。工具正是逐条执行这些操作,把结果按块偏移写回各分区的镜像文件[2]。
以 5ec1cff 的 Python 实现为例,其类结构由命令行接口和核心的 Dumper 类组成:Dumper 负责解析元数据、按操作类型处理数据、以多线程方式并行提取多个分区并汇报进度[2]。解析阶段先校验头部,读出清单长度与签名长度,再用 DeltaArchiveManifest 反序列化清单,并记录块大小等参数[2]。Rust 实现则把解压与差分运算分配到多个 CPU 核心上并行执行,并支持从网络地址只下载所需数据[7]。
发展历程
payload.bin 这种格式伴随 A/B 无缝更新机制出现。安卓 7.0 引入 A/B 分区,设备同时保有两套可更新分区,更新在后台写入非活动槽位,重启后切换[5]。更新包里因此改为只放一个载荷文件,原有的直接解压方式失效,针对该格式的提取工具随之出现[1]。
早期被广泛使用的是 vm03 发布的 Python 脚本,运行需要 Python 3、protobuf 和 bsdiff4 等依赖,既可处理完整更新包,也支持通过 --diff 参数处理增量更新:把上一版本的镜像放入 old 目录后,脚本会应用差分操作还原新镜像[1]。该脚本配有 Docker 镜像,便于在隔离环境中运行[8]。
此后出现了多种改进实现。以 Python 重写并支持直接从压缩包和网络地址提取的版本省去了解压整包的步骤[9]。用 Rust 编写的 payload_dumper 从 2025 年起持续发布版本,具备并行提取、直接从压缩包和网络地址提取、跨平台运行等特性,并参考了 vm03 的早期工作[7]。此外还有面向 Windows 与安卓的图形界面版本,以及无需电脑即可在手机上提取分区的应用[4][10]。
应用
最常见的用途是从官方 OTA 包中取出 boot 镜像。部分厂商的完整固件包内不含 boot.img,该文件只存在于 payload.bin 中,提取后可用 Magisk 修补并通过 fastboot 刷入,以获得 root 权限[11]。除 boot 外,常被单独提取的分区还包括 vendor_boot、init_boot、vbmeta、dtbo、system、vendor 等,提取 vbmeta 可用于修改校验启动相关设置,提取 system 可用于制作通用系统镜像[12]。
在支持网络地址提取的实现中,工具只需下载目标分区所在的数据段。启动镜像通常只有数十兆字节,因此从数吉字节的完整更新包中取出单个分区的下载量可降至约 50 至 100 兆字节,适合带宽有限的场合以及持续集成流程中定期拉取指定镜像[7]。
提取结果也用于固件与安全分析。安全研究人员可比对两个版本提取出的镜像,定位补丁改动的具体位置;由于 Chrome OS 使用同一套更新引擎与载荷格式,该类工具同样可用于其固件的解析[13]。
局限
工具能否工作取决于输入文件是否符合官方载荷格式。若文件损坏,或设备使用的并非该格式的更新包,解析会失败并提示载荷无效[12]。处理增量更新包时还需要预先准备与源版本完全对应的旧镜像,否则引用源数据的操作无法执行[3]。
从网络地址提取要求服务器支持 HTTP 范围请求,否则只能先完整下载文件再在本地解包[7]。并行提取会占用较多内存,内存不足时需关闭并行或减少线程数[7]。部分实现对差分更新中某些操作类型的支持仍不完整,例如对 ZUCCHINI 操作尚未支持[3]。
提取过程本身也受限于输出体积。完整解包一个更新包所需的磁盘空间与镜像总大小相当,有测试显示 3.2 吉字节的压缩包解包后镜像合计约 7.6 吉字节,单线程实现耗时接近 6 分钟[1]。早期的 Python 实现为单线程,不支持列出分区清单,也不支持仅提取指定分区,速度明显慢于后续实现[1]。此外,工具只还原镜像文件,不负责校验厂商签名,提取结果的完整性与可信度仍取决于原始更新包[5]。
参见
-
安卓 —— 该工具所服务操作系统的更新包是其处理对象。
-
payload.bin —— 工具直接解析的载荷文件格式。
-
A/B 分区 —— 促使载荷格式出现的无缝更新机制。
-
update_engine —— 安卓负责应用载荷的官方守护进程,其格式与操作类型是该工具的依据。
-
Magisk —— 提取出的 boot 镜像常用于配合其进行修补。
-
差分更新 —— 增量更新包中还原镜像所依赖的差分技术。
参考资料
- Android OTA payload dumping / extraction: 4 tools review [引用日期2026-10-14]
- System Architecture | 5ec1cff/payload-dumper | DeepWiki [引用日期2026-10-14]
- payload-dumper-rust [引用日期2026-10-14]
- payload-dumper-gui [引用日期2026-10-14]
- Chapter 55: OTA Updates¶ [引用日期2026-10-14]
- payload_constants [引用日期2026-10-14]
- payload_dumper 0.8.4 [引用日期2026-10-14]
- payload_dumper [引用日期2026-10-14]
- payload-dumper [引用日期2026-10-14]
- Payload-Dumper-Android alternatives and similar packages [引用日期2026-10-14]
- 谷歌Pixel4手机刷机从payload.bin中提取boot.img [引用日期2026-10-14]
- payload-dumper [引用日期2026-10-14]
- Windows 64位payload_dumper工具:用于Android OTA增量包解析与载荷提取 [引用日期2026-10-14]