2. 生成OTA升级包
任务说明
本案例目标:在已有版本A(当前系统)与版本B(目标系统)的构建产物基础上,使用Android官方构建工具生成从A到B的OTA差分包(增量包),并验证生成的差分包zip文件完整性。
环境与前置条件
- 已完整编译过Android源码A版本与B版本,且两个版本均已完成
make全量构建。 - 构建输出目录中包含A版本与B版本的
target_files包(即$(OUT)/obj/PACKAGING/target_files_intermediates/*-target_files-*.zip),或已通过make dist生成正式target_files包。 - 主机环境为Linux(推荐Ubuntu 18.04+),已配置Android源码编译环境(
lunch已执行)。
核心实现
OTA差分包生成依赖Android源码中的build/tools/releasetools/ota_from_target_files脚本。以下命令在Android源码根目录下执行,生成从A到B的差分包:
# 1. 设置编译环境(若未在当前shell执行过)
source build/envsetup.sh
lunch <你的产品配置> # 例如:lunch aosp_arm64-userdebug
# 2. 生成差分包(A为旧版本,B为新版本)
./build/tools/releasetools/ota_from_target_files \
-i ./out/dist/a-target_files.zip \
-p ./out/host/linux-x86 \
-k ./build/target/product/security/testkey \
./out/dist/b-target_files.zip \
./ota_incremental_A_to_B.zip
参数说明:
-i:指定旧版本A的target_files包路径。-p:指定主机工具目录(包含fs_config、mkbootfs等二进制)。-k:签名密钥路径,此处使用Android默认测试密钥testkey;实际产品需替换为厂商正式签名密钥。- 最后一个参数为输出差分包路径,此处命名为
ota_incremental_A_to_B.zip。
若A、B版本间差异较大(如system分区变化超过阈值),脚本可能自动回退为生成全量包,此时输出包仍为合法OTA包,但体积接近全量包。如需强制生成差分包,可添加--no_full参数(不推荐,可能导致设备升级失败)。
包完整性验证
生成完成后,执行以下命令验证zip包结构完整且可被正确解析:
# 1. 检查zip包能否正常解压列表
unzip -l ota_incremental_A_to_B.zip | head -20
# 2. 验证zip包CRC校验(无输出错误即通过)
unzip -t ota_incremental_A_to_B.zip
# 3. 检查关键OTA元数据文件是否存在
unzip -l ota_incremental_A_to_B.zip | grep -E "META-INF/com/android/metadata|payload.bin|care_map.pb"
判定通过条件:
unzip -t命令无任何报错,输出末尾包含No errors detected in compressed data。- 上述三个关键文件(
metadata、payload.bin、care_map.pb)均存在于包内。 - 使用
unzip -p ota_incremental_A_to_B.zip META-INF/com/android/metadata查看metadata内容,应包含类似pre-build-incremental=与post-build=字段,且分别对应A、B版本的构建指纹。
常见问题
- 找不到
target_files包:需在源码根目录执行make dist,产物位于out/dist/目录。 - 签名不匹配:若设备已刷入正式签名系统,此处必须使用与设备当前系统一致的正式密钥,否则设备升级时签名校验失败。
- 差分包过大:检查A、B版本间是否发生了分区格式变化(如ext4→erofs)或大量系统应用变更,此类情况会触发全量回退。