一文吃透RK平台OTA升级开发:从逻辑到调试的完整指南

科创之家 2026-02-10 7人围观

Rockchip(简称RKAndroid平台开发中,OTAOver The Air)升级是实现设备软件迭代的核心方式。无论是本地卡刷升级,还是在线无缝更新,掌握OTA升级的技术细节,能让开发者高效解决固件更新、功能迭代等问题。本文将从升级逻辑、核心技巧、调试要点到问题排查,全方位拆解RK平台OTA升级开发,附关键流程图示,助力开发者快速上手。

一、OTA升级核心逻辑:两种系统架构的差异

RK平台OTA升级需区分AB系统AB系统,两者的分区设计、升级流程差异显著,需针对性开发。

1.1AB系统:传统Recovery升级逻辑

AB系统(即传统分区系统)通过Recovery模式完成升级,核心特点是单组分区+重启升级,升级时设备需进入Recovery模式,暂时无法使用。

分区设计:仅包含一套系统分区(如systembootvendor等),升级时直接覆盖原分区。

升级流程

a.生成完整OTA包(含全量系统文件)或差异包(仅含版本间变更内容);

b.将升级包放入USB/SD卡或内置存储(如/data/media/0/);

c.设备检测到升级包后重启进入Recovery模式;

d.Recovery校验升级包,覆盖原系统分区,完成后重启进入新系统。

适用场景:对升级时效性要求不高、存储空间有限的设备(如入门级物联网设备、旧款智能硬件)。

1.2 AB系统:无缝升级逻辑

AB系统(双分区系统)通过双组分区+后台升级实现无缝更新,升级时设备可正常使用,重启后直接切换到新系统,核心特点是零停机升级

分区设计:所有关键分区(如bootsystemvendor)均包含A/B两组(如boot_a/boot_bsystem_a/system_b),一组为活跃分区(当前使用),一组为备用分区(待升级)。

升级流程

a.设备在Android主系统运行时,后台下载OTA包;

b.升级程序将OTA包内容写入备用分区(不影响活跃分区);

c.升级完成后提示用户重启,重启时切换活跃分区(如从A组切换到B组);

d.若新分区启动失败,系统自动回滚到原活跃分区,保障设备可用性。

适用场景:对升级体验要求高的设备(如高端智能屏、工业控制设备),需额外占用约一倍存储空间。

1.3核心逻辑对比图

wKgZPGkaiw2ARy-5AAFsqvnt6ko186.png

二、OTA升级开发核心技巧

无论是非AB还是AB系统,OTA开发的关键在于正确配置系统+生成合规升级包+适配升级介质,以下是实操技巧:

2.1系统配置技巧:按Android版本适配

AB系统默认关闭,需从Android系统、U-BootKernel三方面配置,不同Android版本配置差异如下:

配置维度

Android 12

Android 13

Android ≥14

Android系统配置

1. BoardConfig.mk中设BOARD_USES_AB_IMAGE := true2.新增recovery.fstab_AB(添加slotselect参数);3.导入AB配置并指定fstab文件

Android 12,支持压缩虚拟AB(需额外设BOARD_ROCKCHIP_VIRTUAL_AB_COMPRESSION := true

1.直接在BoardConfig.mk中开启AB2.压缩虚拟AB仅支持GKI版本

U-Boot配置

芯片defconfig中添加CONFIG_ANDROID_AB=y

Android 12

Android 12

Kernel配置

无需额外配置

无需额外配置

无需额外配置

注意:虚拟AB功能(BOARD_ROCKCHIP_VIRTUAL_AB_ENABLE := true)会降低升级性能,非必要不开启;RK3566/3568/3588trust分区,配置时需删除trust_a/trust_b相关项。

2.2 OTA包生成技巧:完整包与差异包

OTA包分为完整包(全量系统,适合首次升级或跨版本升级)和差异包(仅含变更内容,适合小版本迭代,体积小),生成命令需区分系统类型:

1)完整包生成

系统类型

命令1(原生make

命令2build.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 otaAB),避免单独烧录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:需指定python3python3 ./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.logAB)获取日志,重点排查校验失败”“分区挂载错误等关键词。

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格式支持:默认不支持NTFSUSB/SD卡,需先获取NTFS授权,再开启KernelNTFS配置(CONFIG_NTFS_FS=y),否则升级包无法识别。

关键文件保存:需持久化的文件(如升级状态、配置参数),建议保存到/cache/recovery/Recovery_*路径,该路径格式化时不会被清除,避免升级中断后配置丢失。

四、常见问题与解决方案

OTA升级中常遇到升级包无法识别”“升级失败回滚”“Loader升级失败等问题,以下是高频问题的排查思路:

4.1升级包无法识别/校验失败

问题现象

可能原因

解决方案

设备未弹出升级对话框

1.升级包未放在根目录;2.包名不是update.zip3. USB/SD卡未挂载

1.update.zip放入USB/SD卡根目录或/data/media/0/2.插拔USB线或重启设备触发检测;3. AB系统需用update_device.py脚本触发升级

升级包校验失败

1.包损坏或签名错误;2.素材包版本不匹配(差异包)

1.重新生成OTA包,确保签名密钥正确(默认key路径:Android 13device/rockchip/common/security/testkey,其他版本为build/make/target/product/security/testkey);2.差异包需确保基于前一版本素材包生成

4.2 AB系统升级回滚

问题现象

可能原因

解决方案

重启后回滚到原系统

1.备用分区写入错误;2.分区切换配置错误

1.查看update_engine.log,排查写入失败原因(如分区空间不足);2.检查U-BootCONFIG_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.zip2.执行命令: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升级开发,实现设备的稳定迭代。

  • 随机文章
  • 热门文章
  • 热评文章
不容错过
Powered By Z-BlogPHP