2. 生成全量OTA升级包

任务目标

在Android系统源码环境中,基于新版本构建产物生成全量OTA升级包(full OTA package),该升级包可将设备从任意旧版本直接升级到当前新版本。生成后需检查包内关键文件是否完整。

环境与前置条件

  • 已完整编译新版本Android系统,输出目录为 $OUT(通常为 out/target/product/<device>)
  • 已设置Android构建环境:source build/envsetup.sh 且已执行 lunch <product>-userdebug
  • 构建机已安装Java开发工具包(JDK 8或17,取决于Android版本)

核心实现:生成全量OTA包

使用构建系统自带的 ota_from_target_files 脚本,以新版本的目标文件包(target_files zip)为输入生成全量OTA升级包。该脚本位于 build/tools/releasetools/ 目录下。

# 1. 生成目标文件包(若尚未生成)
# 在完整编译后,target_files包位于 $OUT/obj/PACKAGING/target_files_intermediates/<product>-target_files-*.zip
# 若不存在,可手动执行:
# make target-files-package

# 2. 生成全量OTA升级包
# 语法:ota_from_target_files [选项] target_files包 输出OTA包
# -k 指定签名密钥(使用平台测试密钥)
# -i 不指定时默认生成全量OTA包(包含系统完整镜像)

TARGET_FILES=$OUT/obj/PACKAGING/target_files_intermediates/<product>-target_files-*.zip
OTA_OUT=$OUT/full_ota_update.zip

./build/tools/releasetools/ota_from_target_files \
    -k build/target/product/security/testkey \
    "$TARGET_FILES" \
    "$OTA_OUT"

# 3. 验证生成结果
ls -lh "$OTA_OUT"

检查OTA包内容

全量OTA包是ZIP格式,内部包含升级脚本、系统镜像及元数据。使用 unzip -l 检查关键文件是否存在:

unzip -l "$OTA_OUT" | grep -E "(system|boot|META-INF|payload)"

预期输出应包含以下关键条目(以A/B分区方案为例):

  • payload.bin — 包含系统、vendor、boot等分区镜像的二进制增量数据
  • payload_properties.txt — payload的哈希与大小元数据
  • care_map.pb — 分区映射表(用于增量验证)
  • META-INF/com/android/metadata — 包含构建指纹、时间戳、OTA类型(FULL)等属性
  • META-INF/com/android/otacert — OTA证书

验证方法与判定标准

  1. 生成成功标志:脚本执行无报错退出,输出文件存在且大小大于100MB(典型全量包大小,具体取决于系统分区大小)。
  2. 包完整性:执行 unzip -t "$OTA_OUT" 无CRC错误。
  3. 类型确认:解压metadata文件,确认 ota-type=FULL:
    unzip -p "$OTA_OUT" META-INF/com/android/metadata | grep ota-type
    预期输出:ota-type=FULL
  4. 升级路径验证:该包可直接通过 adb sideload 或恢复模式应用到任意旧版本设备,无需中间版本。

常见问题

  • 签名错误:若使用用户密钥,需替换 -k 参数为实际密钥路径,否则设备端验签失败。
  • target_files缺失:若未生成,先执行 make target-files-package 重新生成。
  • 脚本依赖:确保Python 2.7(Android 9及以下)或Python 3(Android 10+)环境正确,且已执行 lunch 使 OUT 变量生效。