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证书
验证方法与判定标准
- 生成成功标志:脚本执行无报错退出,输出文件存在且大小大于100MB(典型全量包大小,具体取决于系统分区大小)。
- 包完整性:执行
unzip -t "$OTA_OUT"无CRC错误。 - 类型确认:解压metadata文件,确认
ota-type=FULL:
unzip -p "$OTA_OUT" META-INF/com/android/metadata | grep ota-type
预期输出:ota-type=FULL - 升级路径验证:该包可直接通过
adb sideload或恢复模式应用到任意旧版本设备,无需中间版本。
常见问题
- 签名错误:若使用用户密钥,需替换
-k参数为实际密钥路径,否则设备端验签失败。 - target_files缺失:若未生成,先执行
make target-files-package重新生成。 - 脚本依赖:确保Python 2.7(Android 9及以下)或Python 3(Android 10+)环境正确,且已执行
lunch使OUT变量生效。