@[toc]
Qboot V2:让 Bootloader 从“能升级”走向“可持续演进”
固件升级这件事,早已不只是“把新程序写进去”这么简单。
在不少 MCU 项目中,最初的目标通常很明确:先把 Bootloader 做出来,先把固件升级跑通,先让设备具备基本的远程维护能力。这样的阶段里,结构简单、接入直接、功能够用,往往比“架构漂亮”更重要。
Qboot V1 正是在这样的背景下体现出价值。它最初的定位就是一个用于快速制作 bootloader 的组件,目标非常务实:把启动、分区、校验、解密、解压、恢复和升级这些关键环节尽快组织起来,让升级链路尽早落地。现有公开版本中,已经包含 AES、GZIP、QuickLZ、FastLZ、HPatchLite、OTA downloader 等能力,本身并不是一个“只有基础功能”的轻量壳子,而是一套已经能够解决实际问题的升级组件。
但项目一旦继续往前推进,问题就会开始变化。
最开始关心的是“能不能升级”,很快就会变成`“升级能不能稳定跑”``“能不能适配更多存储方式”“能不能支持更多算法”“能不能减少包体积”“能不能更容易接入不同产品”“能不能让工具链更适合自动化发布”。到了这个阶段,升级系统已经不再是一个单点功能,而开始成为产品持续演进的一部分。
也正是在这个阶段,Qboot V2 的意义开始显现出来。
从组件到框架,变化不只是功能变多
Qboot V2 的价值,并不只是增加了几个新特性,而是整体思路发生了变化。
如果说 V1 更像一个“能快速做出 Bootloader 的实用组件”,那么 V2 更接近一套“面向长期维护的升级框架”。这次重构的核心方向非常清晰:把原来偏固定的升级路径,演进成可插拔存储后端、可注册算法、可流式处理、可管理升级状态的整体体系。重构说明中,已经明确把目标描述为“可插拔存储后端 + 可注册的加密/压缩/差分算法 + 流式解压模型 + 更新管理器”的升级框架。
这背后最重要的变化,是升级系统不再围绕某一条固定流程堆功能,而是开始围绕“扩展性”和“可维护性”来组织能力。
Qboot V1 的强项,是把升级这件事先做出来
在很多嵌入式项目里,真正稀缺的往往不是“理论上的最佳方案”,而是一个可以快速投入使用、并且足够可靠的工程起点。
Qboot V1 恰好承担了这样的角色。目录结构清晰,功能边界相对直接,主流程围绕常见的分区升级模型展开,适合尽快完成首版升级方案。对很多项目来说,这样的设计非常有效,因为首要目标本来就不是“做一个长期可扩展的平台”,而是“先让设备具备可升级能力”。V1 以 inc、src、doc、tools 为主干组织代码和工具,依赖关系也相对集中,整体风格更偏向实用落地。
这种设计没有问题,甚至可以说非常符合大量 MCU 项目的现实需求。
真正的变化,来自需求本身的增长。
当升级系统开始变复杂,原有模式就会显出边界
一旦产品线扩展,升级系统会很快遇到几类典型问题。
存储方式不再单一。
有的项目使用片内 Flash,有的依赖 FAL,有的需要引入文件系统,有的还会增加下载区、工厂区、差分临时区,甚至混合使用多种后端。继续沿着单一路径生长,后续维护成本通常会越来越高。
算法需求也不再固定。
某一代产品使用 GZIP,下一代可能转向差分升级,再下一代又可能加入自定义加密或更细粒度的配置校验。如果算法能力始终和主流程强绑定,每增加一种支持,系统复杂度就会上升一层。
内存和包体积的矛盾也会越来越明显。
一次性解包在概念上简单,但对资源受限设备并不总是友好。包越大、流程越长、RAM 越紧张,越需要边读、边解、边写的处理方式。
再往前一步,升级过程本身也会变成需要被管理的对象。
等待窗口、下载进度、下载清理、断电恢复、失败回滚、状态持久化,这些都不是“附加功能”,而是量产设备真正能不能稳定升级的关键部分。
这也是为什么 V2 的重构方向会显得更有针对性:它不是为了把代码写得更“新”,而是为了应对升级系统本身已经从单点能力变成了长期基础设施。
Qboot V2 的第一层升级:存储后端不再被固定路径限制
V2 很重要的一步,是把存储能力从主流程里拆出来。
重构后的结构已经引入多后端存储思路,可以看到 FAL 支持、多后端存储、统一存储 IO 抽象、统一句柄访问方式等改动,分区相关参数也进一步向统一类型收敛。这意味着升级流程不再默认绑定在某一种固定存储组织方式上,而是具备了更明确的扩展层。
这种变化在工程层面的价值非常直接。
当产品从单一芯片 Flash 扩展到外部 Flash、文件系统、RAM 缓冲区,甚至需要针对不同分区采用不同介质时,原先那种“够用就好”的固定路径设计,很容易逐渐变成限制。V2 把这部分能力抽象出来之后,升级系统开始具备“按角色选后端”的能力,整个结构也更适合继续生长。
对新项目而言,这意味着前期设计不必过度押注某一种后端方案。
对已有项目而言,这意味着后续做迁移或扩展时,不必反复回头改动主流程。
第二层升级:算法不再只是开关,而是可以注册和组合的能力
V1 已经支持多种压缩、加密和差分相关能力,但在 V2 中,算法体系的组织方式发生了根本变化。
重构内容已经明确提到:加密和压缩算法支持注册机制,加入 NONE 直通模式,扩展并重构 GZIP、FastLZ、QuickLZ 等解压逻辑,同时改进 AES 支持,并对算法解析增加严格匹配和动态配置校验。
这意味着算法从“功能选项”变成“框架能力”。
表面上看,这只是代码组织方式变了;实际上,变化非常深。
算法一旦进入注册体系,就不再必须写死在某条主流程里。新的加密方式、新的压缩方式、自定义接收协议、不同产品线的不同处理链路,都可以在统一的框架下被接入和管理。升级系统从此不再依赖一组不断膨胀的条件分支,而开始拥有更清晰的扩展边界。
这类变化对短期 Demo 的帮助也许不算最明显,但对长期维护、多人协作和多项目复用而言,价值非常高。
第三层升级:流式处理让升级流程更贴近真实设备约束
Bootloader 运行环境和应用层不同,RAM 往往有限,升级过程又往往涉及“读数据、解密、解压、校验、写入”这样一条连续链路。
在这种场景下,一次性处理整包虽然直观,但未必是更合适的选择。
流式处理之所以重要,不是因为“设计更高级”,而是因为它更符合受限环境下的运行现实。
V2 已经把解压和处理模型进一步推进到流式方向,重构说明中明确提到基于流的解压 API,以及围绕字节消耗、字节生成和状态处理的接口调整。这种变化的意义在于:升级系统开始真正围绕“边读、边解、边写”的方式来设计,而不是把资源压力留给最终落地时再补救。
在包体逐渐变大、算法逐渐增多、设备内存预算并不宽松的项目里,这会是一个非常实用的改进。
第四层升级:更新管理器让升级真正成为一条流程
“能升级”与“升级可管理”之间,看起来只差几个状态变量,实际上差的是整套工程方法。
V2 之所以更接近框架,一个很重要的原因在于,它开始把更新过程本身当成需要管理的对象。公开的重构内容中,已经加入更新管理器、下载过程增强、下载会话恢复探测、下载管理改进、上下文结构体化等方向,并补充了进度打印配置、擦除逻辑修复和下载清理流程改进。
这类能力看似不如“新增一种算法”那么醒目,但在实际项目里反而更关键。
真正决定升级体验和可靠性的,通常不是压缩方式本身,而是升级状态机是否完整:
何时进入等待窗口,何时判定下载失败,何时做清理,何时记录状态,何时允许恢复,何时切换分区,何时触发回滚。
当这些能力开始有统一入口,升级系统才真正具备工程化落地的基础。
第五层升级:工具链开始服务工程流程,而不是只服务打包动作
在升级系统里,工具链的意义从来不只是“把包打出来”。
只要项目进入持续发布阶段,工具能否跨平台、能否脚本化、能否接入 CI、能否融入自动化版本流程,都会直接影响方案的可用性。V2 公开信息中已经提到,RBL 包工具重构为纯 Python 实现。这样的变化看似不大,实际上很有价值。
纯 Python 工具意味着环境依赖更轻,接入自动化流程更容易,也更适合持续维护。对于希望把 OTA 纳入日常研发流程的项目来说,这类变化不是附属改良,而是升级体系能否真正进入团队协作链路的重要条件。
为什么说 V2 更适合作为新项目起点
如果只是做一个结构固定、算法固定、后端固定的轻量 Bootloader,V1 依然有现实价值。
它足够直接,足够清楚,也足够适合快速起步。
但只要项目具备以下任一特征,V2 的优势就会越来越明显:
需要支持多种存储后端;
需要支持多种压缩、加密或差分算法;
需要控制 RAM 占用和处理大包;
需要升级过程具备更强的状态管理和恢复能力;
需要让打包和发布流程更适合自动化;
需要面向多个产品型号长期复用同一套升级框架。
在这些场景里,继续在 V1 结构上不断叠加定制逻辑,通常会越来越重。
而从 V2 起步,则可以在更合理的架构上展开后续设计。
这也是 V2 最核心的价值所在:不是把现有功能“再做一遍”,而是把升级系统从“够用”提升到“可持续演进”。
结尾
Bootloader 方案的发展,常常会经历两个阶段。
第一个阶段,重点是尽快把升级做出来。
第二个阶段,重点是让升级能力真正适应产品的长期演进。
Qboot V1 很好地解决了前一个问题。
Qboot V2 正在解决后一个问题。
当升级系统开始面对更多存储形态、更多算法组合、更严格的资源约束、更复杂的状态管理和更高的工程化要求时,继续沿用“固定后端 + 固定流程”的思路,成本只会越来越高。相较之下,一个可插拔、可扩展、可流式处理、可管理状态的升级框架,会更适合作为未来产品的基础设施。
这也是 Qboot V2 更值得被关注的原因。
它不只是一次代码重构。
它更像是一次方向上的升级:
让 Bootloader 不再只是“能升级”,而是开始具备“持续演进”的能力。
总结
一、可插拔存储后端架构
Qboot V2 将固件读取与写入能力从升级流程中抽象出来,通过统一的存储接口层实现多后端支持。
核心能力包括:
- 支持 FAL 分区后端
- 支持 文件系统存储
- 支持 自定义存储驱动
- 支持 多后端组合
- 支持不同升级角色的存储映射(如 APP、DOWNLOAD、FACTORY)
这种存储抽象设计带来的优势包括:
升级逻辑不依赖具体存储介质
可以在片内 Flash、外部 Flash、文件系统等不同环境之间切换
支持复杂存储拓扑,例如:
- APP 在片内 Flash
- 升级包在外部 Flash
- 工厂固件在独立分区
整体结构使升级系统更加模块化和可扩展。
二、可注册算法体系
Qboot V2 将压缩算法、加密算法和差分算法统一纳入 算法注册框架,允许系统在启动阶段注册可用算法。
支持的能力包括:
压缩算法
- GZIP
- QuickLZ
- FastLZ
- NONE(无压缩)
加密算法
- AES
差分算法
- HPatchLite
算法通过统一接口接入,使系统具备以下特点:
- 支持 动态算法注册
- 支持 严格算法匹配
- 支持 算法参数校验
- 支持 用户扩展自定义算法
升级包只需声明所使用的算法类型,系统即可在运行时自动选择对应处理逻辑。
这种设计使升级系统不再依赖固定算法组合,而具备长期扩展能力。
三、流式固件处理模型
Qboot V2 引入 流式处理架构,将固件处理流程拆分为连续的数据流处理步骤。
典型流程包括:
1 | 读取固件数据 |
每一步都通过流式接口处理数据块,而不是一次性加载整个固件。
流式处理带来的优势:
- 显著降低 RAM 占用
- 支持大固件升级
- 支持边读边写
- 提高升级稳定性
在资源受限设备上,这种模型尤其重要。
仓库地址
- QBOOT源码: https://github.com/qiyongzhong0/rt-thread-qboot
- QBOOT V2源码: https://github.com/wdfk-prog/rt-thread-qboot/tree/feature
- QBOOTV2合并到V1的pr及修改总结:https://github.com/qiyongzhong0/rt-thread-qboot/pull/21
- 这个提交审核pr好久了都没有动静,本来想合并到QBOOT源码再写文章推荐的;现在只能先看看有没有人愿意试毒了😄









