1. 构建OTA升级包基础结构

任务目标

构建一个符合Android OTA升级规范的最小升级包,包含META-INF/com/google/android/目录结构、升级脚本updater-script以及系统镜像文件,最终通过zipinfo和签名校验验证包结构完整性。

环境与依赖

  • Linux/macOS环境,已安装zip、openssl(用于生成测试签名)
  • Android SDK Build Tools中的signapk.jar(或使用apksigner替代)
  • 一个用于测试的镜像文件(如system.img,可用任意文件模拟)

实现步骤

  1. 创建标准OTA目录骨架
  2. 编写updater-script(Edify脚本)
  3. 生成测试签名密钥并签名升级包
  4. 验证包结构与签名完整性

关键完整代码

#!/bin/bash
# build_ota_package.sh - 构建最小OTA升级包

set -e

# 1. 定义包结构
PKG_NAME="ota_update_$(date +%Y%m%d).zip"
BUILD_DIR="./ota_build"
META_DIR="$BUILD_DIR/META-INF/com/google/android"

# 2. 创建目录骨架
rm -rf "$BUILD_DIR"
mkdir -p "$META_DIR"

# 3. 生成模拟系统镜像(实际场景为编译产物)
dd if=/dev/urandom of="$BUILD_DIR/system.img" bs=1M count=2 2>/dev/null

# 4. 编写Edify升级脚本
cat > "$META_DIR/updater-script" <<'EOF'
# OTA升级脚本 - 最小示例
ui_print("OTA Update Package - Basic Structure");
ui_print("Mounting /system...");
mount("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "/system");
ui_print("Writing system image...");
package_extract_file("system.img", "/system/system.img");
ui_print("Unmounting /system...");
unmount("/system");
ui_print("Update complete!");
EOF

# 5. 生成测试签名密钥(仅用于验证流程)
if [ ! -f "testkey.pk8" ]; then
    openssl genrsa -out testkey.pem 2048
    openssl pkcs8 -topk8 -inform PEM -outform DER -in testkey.pem \
        -nocrypt -out testkey.pk8
    openssl rsa -in testkey.pem -pubout -out testkey.x509.pem
fi

# 6. 打包(不压缩,便于OTA校验)
cd "$BUILD_DIR"
zip -r -0 "../$PKG_NAME" META-INF system.img
cd ..

# 7. 使用signapk签名(需Android SDK)
# 若使用apksigner,命令为:
# apksigner sign --key testkey.pk8 --cert testkey.x509.pem --out "$PKG_NAME.signed" "$PKG_NAME"
java -jar /path/to/signapk.jar \
    testkey.x509.pem testkey.pk8 \
    "$PKG_NAME" "$PKG_NAME.signed"

# 8. 替换为签名后的包
mv "$PKG_NAME.signed" "$PKG_NAME"

echo "OTA包构建完成: $PKG_NAME"
echo "验证命令: zipinfo -l $PKG_NAME"

验证方法与判定标准

结构验证:执行以下命令,确认输出包含META-INF/com/google/android/updater-script和system.img,且无缺失文件:

zipinfo -l ota_update_*.zip

签名验证:使用apksigner verify --print-certs或signapk对应验证工具,确认签名证书指纹与testkey.x509.pem一致。

脚本语法检查:将updater-script内容与Android Edify语法对照,确认mount/package_extract_file/unmount参数格式正确(本示例为最小演示,实际设备升级需匹配具体分区路径)。

通过条件:以上三项检查全部通过,且zipinfo显示包内无额外文件或目录权限异常。

常见问题

  • 签名工具路径:若本机无signapk.jar,可使用apksigner替代,两者生成的签名格式均符合OTA包要求。
  • 镜像格式:真实OTA包中system.img应为sparse格式或完整ext4镜像,本示例用随机数据文件模拟,仅验证结构流程。
  • 升级脚本兼容性:不同Android版本的Edify函数略有差异,生产环境需对照目标设备的recovery版本调整脚本。