3. 生成OTA升级包
任务说明
本案例目标:在Android源码环境中,使用build/tools/releasetools下的脚本,基于旧版本(当前设备版本)与新版本(目标升级版本)的构建产物,生成可用于设备升级的OTA差分包(增量包)。
环境与前置条件
- 已完整编译Android源码,生成旧版本(假设为
OLD)与新版本(假设为NEW)两套构建输出。 - 两套构建输出均包含:
target/product/<device>/obj/PACKAGING/target_files_intermediates/<device>-target_files-*.zip(即target_files包)。 - 主机环境为Linux(推荐Ubuntu 18.04+),已配置Android编译环境(
source build/envsetup.sh与lunch)。 - OTA脚本依赖Python 2.7(Android 9及以下)或Python 3(Android 10+),请根据源码版本确认。
核心实现
以下脚本展示了从两份target_files包生成OTA增量包的最小完整流程。将脚本保存为generate_ota.sh并赋予执行权限。
#!/bin/bash
# generate_ota.sh - 生成从旧版本到新版本的OTA增量包
# 用法: ./generate_ota.sh <OLD_TARGET_FILES.zip> <NEW_TARGET_FILES.zip> <输出目录>
set -e
# ---------- 参数检查 ----------
if [ $# -ne 3 ]; then
echo "用法: $0 <OLD_TARGET_FILES.zip> <NEW_TARGET_FILES.zip> <输出目录>"
exit 1
fi
OLD_TF=$(realpath "$1")
NEW_TF=$(realpath "$2")
OUT_DIR=$(realpath "$3")
mkdir -p "$OUT_DIR"
# ---------- 环境准备 ----------
# 假设已执行: source build/envsetup.sh && lunch <product>-userdebug
# 若未设置,则尝试自动定位
if [ -z "$ANDROID_BUILD_TOP" ]; then
echo "错误: 请先 source build/envsetup.sh 并 lunch"
exit 1
fi
cd "$ANDROID_BUILD_TOP"
# ---------- 生成OTA增量包 ----------
# 使用ota_from_target_files脚本,-i指定旧包,生成增量升级包
python3 build/tools/releasetools/ota_from_target_files \
-i "$OLD_TF" \
-p "$OUT_DIR" \
-k "$ANDROID_BUILD_TOP/build/target/product/security/testkey" \
"$NEW_TF" \
"$OUT_DIR/ota_incremental.zip"
echo "OTA增量包已生成: $OUT_DIR/ota_incremental.zip"
运行方式
- 确保已进入Android源码根目录并完成环境初始化:
source build/envsetup.sh lunch <your-product>-userdebug - 执行脚本:
chmod +x generate_ota.sh ./generate_ota.sh \ /path/to/old-target_files.zip \ /path/to/new-target_files.zip \ /path/to/output_dir
验证方法
- 检查输出文件:确认
output_dir/ota_incremental.zip已生成,且文件大小非零(通常为几MB到几十MB,取决于差异大小)。 - 查看包内容:
应包含unzip -l output_dir/ota_incremental.zip | head -20META-INF/com/google/android/updater-script、payload.bin、payload_properties.txt等关键文件。 - 验证签名:
应显示unzip -p output_dir/ota_incremental.zip META-INF/com/android/metadatapost-build为新的构建指纹,pre-build为旧的构建指纹。 - 通过条件:脚本退出码为0,且上述文件与元数据存在且内容正确,即视为生成成功。
常见问题
- 找不到
ota_from_target_files:确认源码版本对应路径存在(Android 10+在build/tools/releasetools/,部分版本在build/make/tools/releasetools/)。 - Python版本不匹配:Android 9及以下使用
python而非python3,请按需替换。 - 签名密钥:生产环境应使用正式发布密钥替换
testkey路径。