目录
[一. 基本介绍](#一. 基本介绍)
[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/。它的核心职责是:
-
监听系统广播:开机完成、存储设备挂载(U 盘/SD 卡)、USB 状态变化、网络连接变化。
-
扫描升级包 :在内部存储和外部存储中查找
update.zip或update.img。 -
弹出升级提示 :找到有效包后,拉起
FirmwareUpdatingActivity提示用户。 -
触发 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 systems→DOS/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 升级的完整要点可以归纳为三句话:
-
编译命令要对 :用
./build.sh -UCAKuo,末尾是-o,生成的是update.zipOTA 包,不是update.img整包固件。 -
U 盘格式要对 :推荐 FAT32,避免 exFAT。把
update.zip放在 U 盘根目录,保持.zip后缀。 -
不需要手动签名:SDK 编译出的 OTA 包已内置 testkey 签名,与设备 Recovery 匹配,可直接通过校验。
整个流程依赖 RKUpdateService 的自动检测机制:U 盘挂载广播 → 服务扫描 update.zip → 弹出提示 → 用户确认 → 写入 Recovery 命令 → 重启刷写。只要编译命令、包名、U 盘格式三个环节都正确,升级流程可以完全自动化完成。
这套方案的优势在于:
-
对现场人员友好:不需要连接 PC,不需要进入 Recovery 手动操作。
-
流程标准化:基于 Android 原生 OTA 机制,可靠性高。
-
可批量部署:同一套固件和 U 盘可以在多台设备上重复使用。
对于 RK3568 平台的量产固件维护,这是一条值得优先采用的升级路径