RK3568 Android 13 本地 U 盘 OTA 升级实战:基于 RKUpdateService 的完整流程

目录

前言

[一. 基本介绍](#一. 基本介绍)

[1. RKUpdateService 是什么](#1. RKUpdateService 是什么)

[二. 具体操作](#二. 具体操作)

[第一步:用正确的命令编译 OTA 包](#第一步:用正确的命令编译 OTA 包)

[第二步:把 OTA 包放入 U 盘](#第二步:把 OTA 包放入 U 盘)

[第三步:插入 U 盘,等待自动检测](#第三步:插入 U 盘,等待自动检测)

第四步:观察日志(调试用)

总结


前言

在嵌入式 Android 设备量产和现场维护中,本地 U 盘升级是一个高频需求。相比通过网络 OTA 或 PC 端工具刷机,U 盘升级对现场人员最友好:只需要把升级包拷进 U 盘,插上设备,剩下的交给系统自动完成。

RK3568 是 Rockchip 主流的 AIoT 芯片,Android 13 是其较新的系统版本。Rockchip 在 SDK 中预置了 RKUpdateService 这个系统服务,专门负责本地和远程升级检测。但在实际使用中,很多开发者会因为编译命令用错、包名不对、文件位置不对而卡住,甚至误以为需要手动签名才能通过 Recovery 校验。

本文基于一次完整的调试过程,把正确的做法和背后的原理讲清楚。


一. 基本介绍

1. RKUpdateService 是什么

RKUpdateService 是 Rockchip 在 Android 系统中预置的一个系统级服务,位于 vendor/rockchip/common/apps/RKUpdateService/。它的核心职责是:

  1. 监听系统广播:开机完成、存储设备挂载(U 盘/SD 卡)、USB 状态变化、网络连接变化。

  2. 扫描升级包 :在内部存储和外部存储中查找 update.zipupdate.img

  3. 弹出升级提示 :找到有效包后,拉起 FirmwareUpdatingActivity 提示用户。

  4. 触发 Recovery 升级 :用户确认后,调用 RKRecoverySystem.installPackage() 写入升级命令,重启进入 Recovery 完成刷写。

升级包格式:update.zip 与 update.img 的区别

格式 用途 处理方式
update.zip Android 标准 OTA 包 由 Recovery 解析并刷写各分区
update.img Rockchip 整包固件 由 Rockchip 底层 update 程序处理,用于整机烧录

本文要走的路线是 update.zip + Recovery OTA,这是 Android 标准升级路径,也是 RKUpdateService 原生支持的路径。

升级流程概览

复制代码
U盘插入 → vold 挂载 → 发送 MEDIA_MOUNTED 广播
    → RKUpdateReceiver 收到广播
    → 启动 RKUpdateService 执行 COMMAND_CHECK_LOCAL_UPDATING
    → 扫描到 update.zip
    → 弹出升级提示
    → 用户确认 → 写入 /cache/recovery/command
    → 重启进入 Recovery → 自动刷写

二. 具体操作

第一步:用正确的命令编译 OTA 包

这是整个流程中最容易出错的一步。RK 的 build.sh 提供了多个参数,用途各不相同:

bash 复制代码
./build.sh -UCAKuo 

参数含义:

参数 作用
-U 编译 uboot
-C 用 Clang 编译 kernel
-K 编译 kernel
-A 编译 Android
-o 编译 OTA 包(关键)

注意:末尾的 -o 是 OTA 包的关键参数。

常见的错误用法:

  • -UCKApu:末尾是 -p -u,只会生成整包固件 update.img,归档到 IMAGE/ 目录,不会生成 OTA 包

  • -UCAKu:只生成 update.img,不生成 update.zip

编译完成后,OTA 包位于:

bash 复制代码
out/target/product/rk3568_t/rk3568_t-ota-eng.android-builder.zip

同时以下目录也有OTA包:

bash 复制代码
rockdev/Image-rk3568_t/rk3568_t-ota-eng.android-builder.zip

第二步:把 OTA 包放入 U 盘

把编译出的 rk3568_t-ota-eng.android-builder.zip 重命名为 update.zip ,保持 .zip 后缀,放入 FAT32 格式 U 盘的根目录

关于 U 盘格式的重要提醒

  • 推荐 FAT32:vold 默认支持,挂载稳定,读写正常。

  • 避免 exFAT :如果内核没有开启 exFAT支持,vold 虽然能识别设备,但挂载状态会变成 UNMOUNTABLE,导致文件无法读取。需要到内核中make menuconfig中,进入路径:File systemsDOS/FAT/NT Filesystems → 勾选 exFAT filesystem support,保存退出。还需要确认 vold 拥有 exFAT 用户空间工具,一般是默认支持的,不用配置。

第三步:插入 U 盘,等待自动检测

U 盘插入后,vold 会自动挂载,并发送 ACTION_MEDIA_MOUNTED 广播。RKUpdateReceiver 收到广播后会启动 RKUpdateService 执行本地升级检查。

等待约 5-10 秒,屏幕上会弹出升级提示对话框。点击确认后,设备会自动重启进入 Recovery,并自动完成刷写。

注意:如果提示数据不正常,要检查U盘是否有问题,可以对比U盘中包和电脑上包的md5值

第四步:观察日志(调试用)

如果需要确认流程是否正常,可以通过 logcat 观察:

bash 复制代码
logcat -s RKUpdateService:V RKUpdateReceiver:V

总结

RK3568 Android 13 本地 U 盘 OTA 升级的完整要点可以归纳为三句话:

  1. 编译命令要对 :用 ./build.sh -UCAKuo,末尾是 -o,生成的是 update.zip OTA 包,不是 update.img 整包固件。

  2. U 盘格式要对 :推荐 FAT32,避免 exFAT。把 update.zip 放在 U 盘根目录,保持 .zip 后缀。

  3. 不需要手动签名:SDK 编译出的 OTA 包已内置 testkey 签名,与设备 Recovery 匹配,可直接通过校验。

整个流程依赖 RKUpdateService 的自动检测机制:U 盘挂载广播 → 服务扫描 update.zip → 弹出提示 → 用户确认 → 写入 Recovery 命令 → 重启刷写。只要编译命令、包名、U 盘格式三个环节都正确,升级流程可以完全自动化完成。

这套方案的优势在于:

  • 对现场人员友好:不需要连接 PC,不需要进入 Recovery 手动操作。

  • 流程标准化:基于 Android 原生 OTA 机制,可靠性高。

  • 可批量部署:同一套固件和 U 盘可以在多台设备上重复使用。

对于 RK3568 平台的量产固件维护,这是一条值得优先采用的升级路径

相关推荐
Godikov2 小时前
Android10后台弹窗与APK自动更新
android
又见情义3 小时前
RK3568 Android 13 USB OTG/Host 切换调试经验分享
android
终端安全笔记4 小时前
iOS 27 之后「策略空转」:设备升级不报错,但旧策略不再管它
android·网络·安全·ios·智能手机
JMchen5 小时前
实战案例:实现120fps流畅的渐变进度条
android·kotlin·canvas
敲代码的瓦龙5 小时前
Jetpack?DataBinding!!!
android·java·开发语言·mysql·android-studio
Android-Flutter7 小时前
Compose CompositionLocal 详解
android·compose
三少爷的鞋8 小时前
Kotlin 协程闯关:看代码,猜结果
android
2501_9327502610 小时前
Android 跑马灯:从一行 XML 到自定义控件
android
BoomHe1 天前
Android Framework 文件应用移植到 AndroidStudio
android