一文吃透RK平台OTA升级开发:从逻辑到调试的完整指南 电子说
在 Rockchip(简称 RK)Android 平台开发中,OTA(Over The Air)升级是实现设备软件迭代的核心方式。无论是本地卡刷升级,还是在线无缝更新,掌握 OTA 升级的技术细节,能让开发者高效解决固件更新、功能迭代等问题。本文将从升级逻辑、核心技巧、调试要点到问题排查,全方位拆解 RK 平台 OTA 升级开发,附关键流程图示,助力开发者快速上手。
RK 平台 OTA 升级需区分非 AB 系统与AB 系统,两者的分区设计、升级流程差异显著,需针对性开发。
非 AB 系统(即传统分区系统)通过 Recovery 模式完成升级,核心特点是 “单组分区 + 重启升级”,升级时设备需进入 Recovery 模式,暂时无法使用。
•分区设计:仅包含一套系统分区(如 system、boot、vendor 等),升级时直接覆盖原分区。
•升级流程:
a.生成完整 OTA 包(含全量系统文件)或差异包(仅含版本间变更内容);
b.将升级包放入 USB/SD 卡或内置存储(如 /data/media/0/);
c.设备检测到升级包后重启进入 Recovery 模式;
d.Recovery 校验升级包,覆盖原系统分区,完成后重启进入新系统。
•适用场景:对升级时效性要求不高、存储空间有限的设备(如入门级物联网设备、旧款智能硬件)。
AB 系统(双分区系统)通过 “双组分区 + 后台升级” 实现无缝更新,升级时设备可正常使用,重启后直接切换到新系统,核心特点是 “零停机升级”。
•分区设计:所有关键分区(如 boot、system、vendor)均包含 A/B 两组(如 boot_a/boot_b、system_a/system_b),一组为 “活跃分区”(当前使用),一组为 “备用分区”(待升级)。
•升级流程:
a.设备在 Android 主系统运行时,后台下载 OTA 包;
b.升级程序将 OTA 包内容写入 “备用分区”(不影响活跃分区);
c.升级完成后提示用户重启,重启时切换活跃分区(如从 A 组切换到 B 组);
d.若新分区启动失败,系统自动回滚到原活跃分区,保障设备可用性。
•适用场景:对升级体验要求高的设备(如高端智能屏、工业控制设备),需额外占用约一倍存储空间。

无论是非 AB 还是 AB 系统,OTA 开发的关键在于 “正确配置系统 + 生成合规升级包 + 适配升级介质”,以下是实操技巧:
AB 系统默认关闭,需从 Android 系统、U-Boot、Kernel 三方面配置,不同 Android 版本配置差异如下:
|
配置维度
|
Android 12
|
Android 13
|
Android ≥14
|
|
Android 系统配置
|
1. BoardConfig.mk 中设BOARD_USES_AB_IMAGE := true;2. 新增recovery.fstab_AB(添加 slotselect 参数);3. 导入 AB 配置并指定 fstab 文件
|
同 Android 12,支持压缩虚拟 AB(需额外设BOARD_ROCKCHIP_VIRTUAL_AB_COMPRESSION := true)
|
1. 直接在 BoardConfig.mk 中开启 AB;2. 压缩虚拟 AB 仅支持 GKI 版本
|
|
U-Boot 配置
|
芯片 defconfig 中添加CONFIG_ANDROID_AB=y
|
同 Android 12
|
同 Android 12
|
|
Kernel 配置
|
无需额外配置
|
无需额外配置
|
无需额外配置
|
注意:虚拟 AB 功能(BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := true)会降低升级性能,非必要不开启;RK3566/3568/3588 无 trust 分区,配置时需删除 trust_a/trust_b 相关项。
OTA 包分为完整包(全量系统,适合首次升级或跨版本升级)和差异包(仅含变更内容,适合小版本迭代,体积小),生成命令需区分系统类型:
|
系统类型
|
命令 1(原生 make)
|
命令 2(build.sh 脚本,更简洁)
|
输出路径与重命名
|
|
非 AB
|
make installclean && make -j16 && make dist -j16 && ./mkimage.sh ota
|
build.sh –AUCKuop
|
out/target/product/rkxxxx/ 下生成rkxxxx-ota-eng.root.zip,重命名为update.zip
|
|
AB
|
make installclean && make -j16 && make dist -j16 && ./mkimage_ab.sh ota
|
build.sh -ABUCKuop
|
同非 AB,需确保首次编译前执行make clean
|
关键技巧:发布固件必须用mkimage.sh ota(非 AB)或mkimage_ab.sh ota(AB),避免单独烧录 Kernel,否则会导致差异包升级失败。
差异包需基于“前一版本素材包” 和 “当前版本素材包” 生成,步骤如下:
1.编译 v1 版本固件,保存素材包:out/target/product/rkxxxx/obj/PACKAGING/target_files_intermediates/rkxxx-target_files-eng.xxx.zip → 重命名为rkxxxx-target_files-v1.zip,并烧录 v1 固件到设备;
2.修改代码(Kernel/Android),编译 v2 版本固件,保存素材包为rkxxxx-target_files-v2.zip;
3.执行差异包生成命令(按 Android 版本区分):
◦Android <13:./build/tools/releasetools/ota_from_target_files -v -i 旧素材包路径 --block -p ./out/host/linux-x86 新素材包路径 输出差异包路径
◦Android 13:需指定 python3:python3 ./build/tools/releasetools/ota_from_target_files ...
◦Android ≥14:直接调用工具:out/host/linux-x86/bin/ota_from_target_files ...
关键技巧:每发布一个版本,必须保存素材包(target_files.zip)和完整包,否则无法生成后续差异包。
除了 OTA 包,升级介质(SD 卡、USB 盘)和 Loader 的适配也影响升级成功率:
•SD 升级卡制作:用 SDDiskTool 工具,选择 “固件升级” 模式,导入update.img,点击“开始创建”;AB 系统需先在工具 config 中配置UPGRADE_PROGRAM_PARTITION=boot_b。
•USB 升级盘制作:先在 U-Boot 中开启CONFIG_ROCKCHIP_USB_BOOT=y(以 RK3588 为例,修改rk3588_defconfig添加该配置),再用 SDDiskTool 制作,步骤同 SD 卡。
•Loader 升级:正常 OTA 无需升级 Loader,若需升级,将RKLoader.bin放入$(TARGET_DEVICE_DIR)/ota/loader目录,OTA 打包时会自动加入;AB 系统需单独生成update_loader.zip(编译后在 rockdev 目录下),通过 Recovery 命令升级。
OTA 升级调试的核心是 “精准定位问题”,需重点关注 Log 输出、屏幕显示、存储适配三大场景:
升级失败时,需通过 Log 定位原因,可将 Log 输出到串口、SD 卡或/cache/recovery/目录,配置方式:
•打开 Log 输出:修改bootable/recovery/Android.bp,添加对应宏定义:
◦串口输出:-DLogToSerial
◦/cache/recovery/输出:-DLogToCache
◦SD 卡输出(生成recovery.log):-DLogToSDCard
•查看 Log:升级后通过adb pull /cache/recovery/recovery.log(非 AB)或adb pull /data/misc/update_engine/logs/update_engine.log(AB)获取日志,重点排查 “校验失败”“分区挂载错误” 等关键词。
部分设备(如横屏智能屏)在 Recovery 模式下屏幕显示颠倒,需修改旋转配置:
•配置路径:device/rockchip/XXXX/BoardConfig.mk
•旋转参数:
◦不旋转:TARGET_RECOVERY_DEFAULT_ROTATION := ROTATION_NONE
◦旋转 90°:ROTATION_RIGHT
◦旋转 180°:ROTATION_DOWN
◦旋转 270°:ROTATION_LEFT
•NTFS 格式支持:默认不支持 NTFS 的 USB/SD 卡,需先获取 NTFS 授权,再开启 Kernel 中 NTFS 配置(CONFIG_NTFS_FS=y),否则升级包无法识别。
•关键文件保存:需持久化的文件(如升级状态、配置参数),建议保存到/cache/recovery/Recovery_*路径,该路径格式化时不会被清除,避免升级中断后配置丢失。
OTA 升级中常遇到 “升级包无法识别”“升级失败回滚”“Loader 升级失败” 等问题,以下是高频问题的排查思路:
|
问题现象
|
可能原因
|
解决方案
|
|
设备未弹出升级对话框
|
1. 升级包未放在根目录;2. 包名不是update.zip;3. USB/SD 卡未挂载
|
1. 将update.zip放入 USB/SD 卡根目录或/data/media/0/;2. 插拔 USB 线或重启设备触发检测;3. AB 系统需用update_device.py脚本触发升级
|
|
升级包校验失败
|
1. 包损坏或签名错误;2. 素材包版本不匹配(差异包)
|
1. 重新生成 OTA 包,确保签名密钥正确(默认 key 路径:Android 13 为device/rockchip/common/security/testkey,其他版本为build/make/target/product/security/testkey);2. 差异包需确保基于前一版本素材包生成
|
|
问题现象
|
可能原因
|
解决方案
|
|
重启后回滚到原系统
|
1. 备用分区写入错误;2. 分区切换配置错误
|
1. 查看update_engine.log,排查“写入失败” 原因(如分区空间不足);2. 检查 U-Boot 中CONFIG_ANDROID_AB是否开启,Android 配置中slotselect参数是否添加
|
|
问题现象
|
可能原因
|
解决方案
|
|
OTA 包未包含 Loader
|
Loader 未放入$(TARGET_DEVICE_DIR)/ota/loader
|
1. 执行source build/envsetup.sh && lunch XXX后,用get_build_var TARGET_DEVICE_DIR确认路径;2. 将RKLoader.bin放入该路径下的ota/loader目录,重新打包
|
|
AB 系统 Loader 升级无响应
|
未用专用升级包或命令
|
1. 使用 rockdev 目录下的update_loader.zip;2. 执行命令:adb push update_loader.zip /cache/ && adb shell "echo '--fw_rkloader=/cache/update_loader.zip' > /cache/recovery/command" && adb reboot recovery
|
RK 平台 OTA 升级开发需围绕 “系统架构选型→配置适配→包生成→调试排查” 四个环节,核心要点如下:
1.非 AB 系统适合轻量设备,AB 系统适合无缝升级,需权衡存储空间与体验;
2.生成 OTA 包时,完整包用mkimage.sh/mkimage_ab.sh,差异包需保存素材包;
3.调试优先抓 Log,重点排查校验、分区、Loader 三大类问题;
4.AB 系统需注意双分区切换与回滚机制,避免升级变砖。
掌握以上内容,即可高效完成 RK 平台 OTA 升级开发,实现设备的稳定迭代。
全部0条评论
快来发表一下你的评论吧 !