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

二、OTA升级开发核心技巧
无论是非AB还是AB系统,OTA开发的关键在于“正确配置系统+生成合规升级包+适配升级介质”,以下是实操技巧:
2.1系统配置技巧:按Android版本适配
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相关项。
2.2 OTA包生成技巧:完整包与差异包
OTA包分为完整包(全量系统,适合首次升级或跨版本升级)和差异包(仅含变更内容,适合小版本迭代,体积小),生成命令需区分系统类型:
(1)完整包生成
|
系统类型
|
命令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,否则会导致差异包升级失败。
(2)差异包生成(跨版本更新必备)
差异包需基于“前一版本素材包”和“当前版本素材包”生成,步骤如下:
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)和完整包,否则无法生成后续差异包。
2.3升级介质适配技巧:SD卡/ USB盘/ Loader
除了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命令升级。
三、调试要点:Log、屏幕与存储问题排查
OTA升级调试的核心是“精准定位问题”,需重点关注Log输出、屏幕显示、存储适配三大场景:
3.1 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)获取日志,重点排查“校验失败”“分区挂载错误”等关键词。
3.2屏幕旋转适配:解决Recovery显示异常
部分设备(如横屏智能屏)在Recovery模式下屏幕显示颠倒,需修改旋转配置:
•配置路径:device/rockchip/XXXX/BoardConfig.mk
•旋转参数:
◦不旋转:TARGET_RECOVERY_DEFAULT_ROTATION := ROTATION_NONE
◦旋转90°:ROTATION_RIGHT
◦旋转180°:ROTATION_DOWN
◦旋转270°:ROTATION_LEFT
3.3存储适配:NTFS格式与文件保存
•NTFS格式支持:默认不支持NTFS的USB/SD卡,需先获取NTFS授权,再开启Kernel中NTFS配置(CONFIG_NTFS_FS=y),否则升级包无法识别。
•关键文件保存:需持久化的文件(如升级状态、配置参数),建议保存到/cache/recovery/Recovery_*路径,该路径格式化时不会被清除,避免升级中断后配置丢失。
四、常见问题与解决方案
OTA升级中常遇到“升级包无法识别”“升级失败回滚”“Loader升级失败”等问题,以下是高频问题的排查思路:
4.1升级包无法识别/校验失败
|
问题现象
|
可能原因
|
解决方案
|
|
设备未弹出升级对话框
|
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.差异包需确保基于前一版本素材包生成
|
4.2 AB系统升级回滚
|
问题现象
|
可能原因
|
解决方案
|
|
重启后回滚到原系统
|
1.备用分区写入错误;2.分区切换配置错误
|
1.查看update_engine.log,排查“写入失败”原因(如分区空间不足);2.检查U-Boot中CONFIG_ANDROID_AB是否开启,Android配置中slotselect参数是否添加
|
4.3 Loader升级失败
|
问题现象
|
可能原因
|
解决方案
|
|
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升级开发,实现设备的稳定迭代。
-
嵌入式
+关注
关注
5209文章
20656浏览量
336995 -
调试
+关注
关注
7文章
653浏览量
35879 -
OTA
+关注
关注
7文章
630浏览量
38440 -
Rockchip
+关注
关注
0文章
92浏览量
19654
发布评论请先 登录
基于RK3288嵌入式板卡 Android7.1文档索引资料分享
飞凌RK3399平台Android镜像版本升级的两种处理方式-OTA 本地升级、OTA远程升级
RK3399平台Android镜像版本升级的两种处理方式-OTA 本地升级、OTA远程升级
RK3399平台Android镜像版本升级的两种处理方式-OTA 本地升级、OTA远程升级
iTOP-RK3568开发板OTA升级包编译
一文搞定RK平台Wi-Fi/BT调试!从配置到问题解决全攻略
深入解析RK平台GPIO驱动:从原理到调试,开发者必看指南
一文读懂UEFI系统:从应用场景到RK平台开发全攻略
吃透RK芯片parameter文件:从基础配置到开发实战,避开底层所有坑
维护成本直降!RK3576核心板/开发板OTA升级功能详解,触觉智能瑞芯微RK方案商
一文吃透RK平台OTA升级开发:从逻辑到调试的完整指南
评论