1. 课程导入

在Android设备量产与OTA升级的真实工程场景中,系统镜像签名与发布并不是一个“打包完就结束”的动作,而是一条贯穿代码编译、镜像组装、密钥管理、签名校验、版本发布与回滚处置的完整工程链路。很多团队在开发阶段使用测试密钥签名,到了量产阶段才发现密钥丢失、签名链不匹配、AVB校验失败、OTA包被拒等问题,导致产线停摆或用户设备无法升级。本课程的目标,就是把这套链路从“黑盒操作”变成“可理解、可复现、可审计”的工程能力。

本课程围绕一条主线展开:从源码到可发布镜像,再到设备可验证启动与可升级。你不仅要会执行签名命令,更要理解每个签名对象的作用范围、密钥层级、校验时机以及发布策略。

一、学习目标:从“会打包”到“能发布”

完成本课程后,你应当具备以下能力:

  • 理解Android系统镜像的组成结构,包括boot、init_boot、vbmeta、system、vendor、product等分区的作用与依赖关系。
  • 掌握AVB(Android Verified Boot)2.0的校验原理,理解vbmeta、hash descriptor、hashtree descriptor与签名链的关系。
  • 能够独立完成release-key的生成、管理、签名配置与构建系统集成。
  • 能够区分OTA整包与增量包、A/B与非A/B升级路径,并理解payload签名与元数据校验。
  • 能够排查常见签名失败、校验失败、OTA安装失败问题,并形成可复盘的发布检查清单。

二、核心概念:签名对象、密钥层级与校验链

Android签名体系中最容易混淆的是“签什么”和“谁来验”。系统镜像签名主要涉及三类对象:

签名对象典型文件作用校验方
APK签名system/app、priv-app中的apk保证应用完整性与权限归属PackageManager
AVB镜像签名vbmeta.img、boot.img等保证启动链与分区完整性Bootloader / AVB
OTA包签名ota.zip、payload.bin保证升级包来源可信与内容完整Recovery / update_engine

密钥层级通常分为:releasekey(最终发布密钥)、platform(平台签名)、shared(共享库签名)、media(媒体权限签名)、networkstack等。它们通过lpmake、avbtool、signapk等工具嵌入镜像或APK中。理解这些密钥的用途,是避免“用错key导致设备变砖”的前提。

Android系统镜像签名与发布工程 · 整体框架 ① 源码与构建 repo sync / lunch make otapackage 生成分区镜像 ② 密钥管理 releasekey / platform shared / media HSM / 密钥库 ③ 镜像签名 avbtool add_hash_footer vbmeta 签名链 signapk 签名 APK ④ 发布与OTA 整包 / 增量包 payload 签名 灰度 / 回滚 设备侧校验链:Bootloader → vbmeta → boot/system/vendor Bootloader 验证 vbmeta 签名 vbmeta.img hash / hashtree boot / system 分区完整性 启动 或拒绝 学习路径:概念 → 工具 → 实操 → 排障 → 发布复盘 镜像结构 AVB原理 签名工具 OTA发布 排障

三、方法流程:一次完整发布要经过哪些步骤

以A/B设备量产发布为例,典型流程如下:

  1. 准备发布密钥:生成或导入releasekey,配置vendor/xxx/security/releasekey,确保PRODUCT_DEFAULT_DEV_CERTIFICATE指向正确路径。
  2. 构建镜像:执行make dist或make otapackage,产出target_files.zip与ota_from_target_files所需中间件。
  3. 签名镜像:使用avbtool为boot、system、vendor等添加hash footer,并生成vbmeta。
  4. 签名OTA包:通过signapk或ota_from_target_files对整包/增量包签名,生成payload属性文件。
  5. 校验与发布:在真机或模拟器上验证AVB状态、OTA安装、回滚策略,最后推送灰度。
# 典型签名命令示例
avbtool add_hash_footer \
  --image boot.img \
  --partition_name boot \
  --partition_size 67108864 \
  --key releasekey.pem \
  --algorithm SHA256_RSA2048

avbtool make_vbmeta_image \
  --output vbmeta.img \
  --key releasekey.pem \
  --algorithm SHA256_RSA2048 \
  --include_descriptors_from_image boot.img \
  --include_descriptors_from_image system.img

四、案例场景:一次OTA失败带来的复盘

某项目在灰度阶段发现部分设备升级后无法启动,日志显示avb_slot_verify返回AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION。排查后发现:开发人员用测试key签了vbmeta,但boot.img仍保留旧releasekey的hash footer,导致vbmeta中的descriptor与boot实际内容不匹配。修复方式是统一使用同一套releasekey重新签名所有分区,并在BoardConfig.mk中固定BOARD_AVB_KEY_PATH。这个案例说明:签名链的一致性比单个镜像签名是否正确更重要。

常见误区:只关注make是否成功,不检查avbtool verify_image结果;把releasekey提交到Git仓库;OTA包签名与镜像签名使用不同密钥;忽略vbmeta_system与vbmeta_vendor的分链关系。这些都会在量产阶段集中爆发。

五、整体框架与学习路径

本课程后续章节将按“概念—工具—实操—排障—发布”递进展开。建议学习路径为:先理解分区与AVB校验链,再掌握avbtool、signapk、lpmake等工具,随后在真实工程中完成一次从构建到OTA的完整发布,最后通过故障树与检查清单固化经验。每章都会围绕一个可验证的工程目标展开,避免停留在命令记忆层面。

学习本课程时,建议同步准备一台可解锁的测试设备或模拟器,并保留一份可回滚的出厂镜像。签名与发布工程的核心不是“签成功”,而是“签得对、验得过、升得稳、回得去”。