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导致设备变砖”的前提。
三、方法流程:一次完整发布要经过哪些步骤
以A/B设备量产发布为例,典型流程如下:
- 准备发布密钥:生成或导入releasekey,配置
vendor/xxx/security/releasekey,确保PRODUCT_DEFAULT_DEV_CERTIFICATE指向正确路径。 - 构建镜像:执行
make dist或make otapackage,产出target_files.zip与ota_from_target_files所需中间件。 - 签名镜像:使用
avbtool为boot、system、vendor等添加hash footer,并生成vbmeta。 - 签名OTA包:通过
signapk或ota_from_target_files对整包/增量包签名,生成payload属性文件。 - 校验与发布:在真机或模拟器上验证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的完整发布,最后通过故障树与检查清单固化经验。每章都会围绕一个可验证的工程目标展开,避免停留在命令记忆层面。