Delta Package

增量包 - 版本差异升级

定义

Delta Package(增量包)仅包含从源版本到目标版本的差异数据,体积小、传输快,适合带宽受限场景。需指定源版本,与 Full Package 全量包互补。

生成原理

增量包通过二进制差分算法(如 bsdiff、hdiff 等)对比源版本与目标版本固件,仅输出差异块。设备端需具备源版本固件,下载增量包后执行合并与校验,生成目标版本。相比 Full Package 全量包,增量包通常可减少 50%~90% 的传输体积,对 NB-IoT、2G 等窄带场景尤为重要。

使用约束

增量包必须明确指定源版本,仅适用于「源版本→目标版本」的定向升级路径。若设备版本分散(多版本并存),需为每个源版本生成对应增量包,或采用全量包统一升级。平台需在 OTA 任务中校验设备当前版本,匹配失败时自动降级为全量包或跳过。

与 FOTA 流程结合

在 FOTA 固件空中升级流程中,平台根据设备上报的当前版本自动选择增量包或全量包;支持 Gray Release 灰度发布时,可先对部分版本推送增量包验证,再扩大范围。增量包同样需 Firmware Signature 签名校验,确保完整性。

差分包能套用的版本前提

增量包的技术含义,是只传输源版本镜像与目标版本镜像之间的差异,由设备在本地把差异应用到它持有的那一份源镜像上,得到目标镜像。因此包头里的源版本不是备注,而是合成能否开始的条件。设备上报的运行版本、槽里实际存放的镜像版本,必须和包所声明的源版本一致。只满足“版本号字符串相同”还不够,若现场镜像被局部改写或编译选项不同,差异块会贴到错误的位置。适合用增量包的,是同一产品、同一构建系列、源版本集中且链路带宽紧的升级;版本散得很开时,为每个源版本都做差分,维护成本会超过直接发完整包。

使用时平台应先读设备当前版本,再选择对应差分;匹配不到就改发完整包或跳过,不能把最接近的差分凑合装上。设备侧要有足够的暂存空间同时放下差异块和合成结果,空间只够下载、不够合成时,包会在最后一步失败。合成结果仍要做完整性校验,通过后才能写入可启动位置。与A/B 分区配合时,合成应发生在空闲槽或独立暂存区,不要在正在运行的槽上原地覆盖,否则合成失败就没有可启动系统。

源版本不符仍去合并

常见错误是只比较目标版本,不比较源版本。设备已经在中间版本上,却去套“从最初版本到最新版本”的差分,补丁位置错位,合成出的镜像校验失败,严重时写成不可启动的槽。另一种是版本号复用:两个不同内容的构建用了同一个号,差分工具按号匹配,内容却对不上。差分算法或块大小在制作端和设备端不一致,也会表现为下载成功、安装失败。制作差分后若又重新编译了目标包却沿用旧差分,两边哈希不再是一对。

失败后的重试要避免在半成品上再打一次差分。应当丢弃未完成的合成结果,重新确认源镜像仍是原版,再决定重下差分还是改下完整包。任务统计若把“差异包已下载”计成“升级成功”,会掩盖合成失败。空中升级的版本路径还要写进发布说明:允许从哪些源版本增量,哪些版本必须全量。现场私自改过文件系统的样机,不应纳入增量批次,它们不再持有制作差分时假设的那份源镜像。

合成空间不够时停在哪一步

增量包体积小,只说明传输阶段省了空间,设备上仍要有地方存放差异块、源镜像的可读副本以及合成后的目标镜像。三份里任何一份放不下,都应停在下载或合成之前,并保持当前可启动系统不动。有的设备把差异块直接往空闲槽里写,合成到一半空间耗尽,槽里既不是旧系统也不是新系统。此时重试若再打一次差分,会贴在半成品上,失败原因变得无法阅读。正确的停点是:空间不足就放弃这次合成,删除未完成的临时结果,保留源镜像,改走完整包或等清理出空间后再做。

源版本的核对也要发生在擦写之前。设备上报的版本字符串、槽内镜像的校验和制作差分时用的源包,三者不一致就不要开始合成。版本号被复用、或现场镜像被调试改写过,都属于这一类。任务统计应把下载完成、合成失败、已切换启动分开计数,不能把第一个数字当成升级完成。发布说明里要列出这条差分允许的源版本;不在清单上的设备即使目标版本相同,也不要自动套用最接近的包。合成成功之后,仍要以启动后的自检作为这台设备的完成条件。

相关术语

返回设备管理平台专业术语