跳转至

Android OTA

本章节介绍 Allwinner 平台 OTA 升级包的编译和升级方法。A133(ceres-c3)、A733(demo_aiot)和 T527(demo)均使用 Allwinner Update 应用进行本地升级,底层支持传统 Recovery 升级和 A/B 分区升级两种模式。

主板 SOC Product OTA 输出路径
K9 T527 t527_demo_arm64 out/target/product/t527-demo/t527_demo_arm64-full_ota.zip
K10B A733 a733_demo_aiot_arm64 out/target/product/a733-demo-aiot/a733_demo_aiot_arm64-full_ota.zip
A133 A133 ceres_c3 out/target/product/ceres-c3/ceres_c3-full_ota-eng_*.zip

编译 OTA 包

各平台 OTA 完整包的编译方法。

A133 (ceres-c3)

SDK 不支持 ./build.sh ota,需在 build.sh 中手动添加 pack4dist 补丁:

      echo "Start pack image"
      cd android
      pack
+    rm out/target/product/ceres-c3/ceres_c3-full_ota*.zip
+    pack4dist
+    mv out/target/product/ceres-c3/ceres_c3-full_ota-eng.*.zip out/target/product/ceres-c3/ceres_c3-full_ota-eng_$(date +%Y%m%d)_$(date +%H%M).zip
      cd -

Note

执行 ./build.sh 编译完成后自动生成 OTA 包。

A733 (demo_aiot)

SDK 已内置 OTA 编译命令:

./build.sh ota

编译后 OTA 整包生成路径:

out/target/product/a733-demo-aiot/a733_demo_aiot_arm64-full_ota.zip

Note

1. TARGET_PRODUCTa733_demo_aiot_arm64PRODUCT_DEVICEa733-demo-aiot
2. Android 侧编译配置路径为 device/softwinner/jupiter/a733-demo-aiot/device-common.mk
3. A733 SDK 已内置 pack4dist 命令,无需手动打补丁。

make installclean

编译前需确保 make installclean 已执行,保证 prop 信息正常更新。

A133 (ceres-c3)build.sh 顶部设置:

# build.sh 已内置 make installclean

A733 (demo_aiot)build.shANDROID_INSTALLCLEAN 变量控制:

# build.sh 顶部设置
ANDROID_INSTALLCLEAN=true
行为 适用场景
true 执行 make installclean,清除中间文件后全量重编 修改 BoardConfig / 分区大小 / 系统 props 等全局配置
false 增量编译,仅编译变更文件 仅修改 DTS / kernel 配置 / 少量 Java

OTA 签名说明

OTA 包的 payload metadata 需要签名,设备端通过 /system/etc/security/otacerts.zip 中的公钥校验签名。

组件 A133 A733
OTA 编译签名密钥 $keys_dir/releasekey vendor/security/app_keys/releasekey
设备 otacerts.zip testkey.x509.pem testkey.x509.pem

验证签名匹配

# 查看设备信任的证书
adb shell unzip -l /system/etc/security/otacerts.zip

# 查看 OTA 包签名信息
unzip -p ota-full_ota.zip payload_properties.txt | grep -i hash
# 缺少 METADATA_SIGNATURE 行表示未签名或签名密钥不匹配

修复签名不匹配

当 OTA 编译签名密钥与设备 otacerts.zip 中的公钥不一致时,修改 device/softwinner/common/vendorsetup.sh

- ota_gen_param+=" -k $keys_dir/releasekey"
+ ota_gen_param+=" -k build/make/target/product/security/testkey"

然后重新执行 OTA 编译。

升级前提

1. 接入电池状态下,升级时请保证电池电量充足;未接入电池状态下,dts 需要关闭电池供电。

                                 battery_power_supply: battery-power-supply {
                                         compatible = "x-powers,axp803-battery-power-supply";
-                                        status = "okay";
+                                        status = "disabled";

                                         pmu_chg_ic_temp = <0>;
                                         pmu_battery_rdc= <93>;

Warning

1. 默认软件会打开此选项,用于兼容有电池和无电池两种开机场景。
2. 未接入电池状态下,必须关闭此选项才能支持 OTA 升级,否则 OTA 升级检测到电池电量过低,导致升级失败。

2. 保证 OTA 包的镜像日期高于主板原本的镜像日期。

Tip

./build.sh ota 编译时自动执行 make installclean,无需手动追加。

升级流程

1. 首先确保 OTA 包和主板信息满足升级前提。

2. 将 OTA 包存放到 /sdcard/ 路径下。

方式 命令
ADB adb push <ota_zip> /sdcard/
U盘 cp /mnt/udisk/*.zip /sdcard/

3. 系统打开 Setting -> System -> Advanced -> Local Update。

adb shell am start -n com.softwinner.update/com.softwinner.update.MainActivity

A133 (ceres-c3)

A133_OTA_ENTER

4. 选择 OTA System Update。

image-20250916171506303

5. 选中对应的 OTA 包,等待认证。

image-20250916171547458

6. 点击 Start install。

image-20250916171617182

7. 点击 ok,等待升级完成。

image-20250916171709862

A733 (demo_aiot)

4. 选择 OTA System Update(左侧面板)。

5. 点击 "Please select update package!" 文本,系统将打开 DocumentsUI 文件选择器。

6. 在文件选择器中导航至 /sdcard/ (Internal Storage),选中对应的 OTA 包,等待认证。

7. 弹出确认对话框,点击 "I got it"。

验证

8. 等待升级完成(A/B 升级或 Recovery 模式自动重启)。

9. 升级完成后,可通过验证新的功能或系统编译属性确认变更。

$ getprop ro.build.date
 [Tue Sep 16 16:44:38 CST 2025]

升级原理

OTA 升级的底层工作原理,包括传统 Recovery 和 A/B 分区两种模式。

传统 Recovery 升级

OTA 包被复制到 /cache/update.zip,然后调用 RecoverySystem.installPackage() 重启进入 Recovery 模式安装。

关键源码:

  • OtaUpgradeUtils.javaDEFAULT_PACKAGE_NAME = "update.zip"CHCHE_PARTITION = "/cache/"
  • VerifyPackage.java — 校验 OTA 包完整性

A/B 分区升级

OTA 包的 payload 通过 update_engine_client 直接写入非活动 slot(B slot),升级完成后切换 slot 重启。

关键源码:

  • AbUpdate.java — A/B 升级 UI 和逻辑
  • UpdateService.javaupdate_engine_client --update --payload=file://<path>
  • FileSearch.java — 扫描所有挂载点的 .zip 文件

调试方法

OTA 升级的日志捕获、关键标记和常见错误排查方法。

1. 捕获升级日志

# 清除旧日志
adb logcat -c

# 执行升级操作...

# 导出全部日志
adb logcat -v threadtime -d > ota_log.txt

2. 关键日志标记

日志标记 说明
AbSelectPackage 文件选择回调,包含传入的文件路径
AbUpdate A/B 升级,解析 OTA 包(size/name)
update_engine 底层 OTA 引擎(签名校验/分区写入)

3. 常见错误及分析

3.1. 签名不匹配

kDownloadMetadataSignatureMismatch

AbUpdate: size: 1063382761
AbUpdate: name: META-INF/com/android/metadata
update_engine: InstallPlan: source_slot: A, target_slot: B
update_engine: [ERROR:payload_verifier.cc(137)] None of the 1 signatures is correct
update_engine: [ERROR:delta_performer.cc(372)] Mandatory metadata signature validation failed
update_engine: [ERROR:download_action.cc(227)] Error ErrorCode::kDownloadMetadataSignatureMismatch (26)

原因: OTA 编译签名密钥与设备 otacerts.zip 中的公钥不匹配。

排查:

# 查看设备信任的证书
adb shell unzip -l /system/etc/security/otacerts.zip

# 查看 OTA 编译配置的签名密钥
grep 'ota_gen_param.*-k' device/softwinner/common/vendorsetup.sh

# 对比两个证书指纹
openssl x509 -in build/make/target/product/security/testkey.x509.pem \
  -noout -fingerprint -sha256

3.2. 文件路径为空

W AbSelectPackage: File is null, Please retry!

原因: DocumentsUI 文件选择器未正确返回文件 URI。

解决: 重新操作一次即可。

3.3. 文件路径为 content URI

W AbSelectPackage: file path is: content://com.android.externalstorage.documents/...
W AbSelectPackage: INDEX_FILE_CHECK

正常现象,Update App 处理 content URI 后会开始解析 OTA 包。

3.4. 电池检测失败

升级界面提示电量不足相关错误。

排查: 确认 dts 中 battery-power-supply 状态已按要求关闭(见"升级前提"章节)。

3.5. SELinux 权限拒绝

I ftwinner.update: type=1400 audit: avc: denied { open } for path="/dev/__properties__/...vendor_default_prop..."

排查: 确认 SELinux 为 permissive 模式或已添加对应的 sepolicy 规则。

4. 查看 Recovery 日志

# 需设备 root
adb shell "su 0 ls -la /cache/recovery/"
adb shell "su 0 cat /cache/recovery/last_log"
adb shell "su 0 cat /cache/recovery/last_install"

常见问题

  • OTA 升级失败?

1. 确认是否满足升级条件。

2. 通过查看对应的升级日志 last_log 中包含的升级信息来查找原因。

$ ls /cache/recovery/
block.map    last_kmsg.1 last_kmsg.4 last_log   last_log.3 uncrypt_file
last_install last_kmsg.2 last_kmsg.5 last_log.1 last_log.4
last_kmsg    last_kmsg.3 last_locale last_log.2 last_log.5

3. 更多问题可参考文档。

Android_10_OTA_开发指南.pdf

相关源码路径

组件 路径
Update App vendor/aw/public/package/apk/Update/app/src/main/java/com/softwinner/update/
ABUpdater vendor/aw/public/package/apk/ABUpdater/
OTA 编译脚本 device/softwinner/common/vendorsetup.sh (pack4dist)
Update 配置 device/softwinner/jupiter/a733-demo-aiot/ (A733)
kernel DTS longan/device/config/chips/a733/configs/demo_aiot/board.dts (A733)