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 编译命令:
编译后 OTA 整包生成路径:
Note
1. TARGET_PRODUCT 为 a733_demo_aiot_arm64,PRODUCT_DEVICE 为 a733-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 顶部设置:
A733 (demo_aiot) — build.sh 中 ANDROID_INSTALLCLEAN 变量控制:
| 值 | 行为 | 适用场景 |
|---|---|---|
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。
A133 (ceres-c3)¶

4. 选择 OTA System Update。

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

6. 点击 Start install。

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

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. 升级完成后,可通过验证新的功能或系统编译属性确认变更。
升级原理¶
OTA 升级的底层工作原理,包括传统 Recovery 和 A/B 分区两种模式。
传统 Recovery 升级¶
OTA 包被复制到 /cache/update.zip,然后调用 RecoverySystem.installPackage() 重启进入 Recovery 模式安装。
关键源码:
OtaUpgradeUtils.java—DEFAULT_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.java—update_engine_client --update --payload=file://<path>FileSearch.java— 扫描所有挂载点的.zip文件
调试方法¶
OTA 升级的日志捕获、关键标记和常见错误排查方法。
1. 捕获升级日志¶
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. 文件路径为空¶
原因: 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. 更多问题可参考文档。
相关源码路径¶
| 组件 | 路径 |
|---|---|
| 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) |