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)或大量系统应用变更,此类情况会触发全量回退。