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

电子说

1.4w人已加入

描述

 

 

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

 

 

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

 

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

 

 

1.1 非 AB 系统:传统 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 组切换到 组);

 

 

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

 

 

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

 

 

1.3 核心逻辑对比图

 

OTA

二、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/3588 无 trust 分区,配置时需删除 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 格式支持:默认不支持 NTFS 的 USB/SD 卡,需先获取 NTFS 授权,再开启 Kernel 中 NTFS 配置(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 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.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 升级开发,实现设备的稳定迭代。

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分