Skip to content

resource-package-verifier ​

1. 实验目标与工程要点 ​

这个样板把 download_service.dart 案例里的“校验阶段”单独拎出来,验证三个最常漏掉的闸门:

  • 文件大小是否匹配元信息
  • SHA-256 是否匹配
  • manifest 里的资源版本是否与远端声明一致

它解决的问题不是“如何下载”,而是下载后的候选资源包能不能被宣布为可晋升版本。


2. 深入原理与生活浅显比喻 ​

2.1 生活浅显比喻 ​

资源包校验像仓库收货验收入库:

  • 先看箱子重量对不对(size)
  • 再看防伪码对不对(hash)
  • 最后开箱确认货号和清单对不对(manifest)

前两步只证明“箱子像是对的”,最后一步才证明“业务真的能用”。

2.2 底层原理分析 ​

典型端上更新至少要分三层验证:

  1. 传输完整性:size 是否一致
  2. 内容完整性:sha256 是否一致
  3. 业务可用性:manifest / 入口文件 / 版本兼容性是否一致

如果只做前两层,不做 manifest 校验,仍然可能出现:

  • ZIP 能解压,但入口文件名不对
  • 资源版本与客户端策略不兼容
  • CDN 缓存了旧包,却配了新版本号

2.3 方案对比矩阵 ​

方案通俗比喻底层原理保证特性吞吐性能运行开销适用场景
只看 HTTP 200快递签收就算成功只证明响应完成最弱高低Demo、非关键缓存
size + hash重量 + 防伪码证明传输和字节一致中中中大部分资源包下载
size + hash + manifest收货后再核对货单加业务可用性校验强中中高离线包、模型、配置更新

3. Android / 移动端实战场景与误配事故 ​

3.1 实战场景 ​

  • Flutter 离线包下载后准备切换 active 目录
  • Android WebView 资源包更新
  • 端上模型 / 配置包升级

3.2 常见误配与事故注意事项 ​

  • 只校验 hash,不校验 manifest,结果业务入口文件缺失
  • 远端 version 已升级,但本地还拿旧 manifest,误把坏包当可用包
  • 校验失败后不分类,后续无法判断要不要自动重试

3.3 排障思路 ​

先看失败属于哪一类:

  1. sizeMismatch
  2. hashMismatch
  3. manifestInvalid
  4. versionMismatch

只有分清层次,才能决定是删 staging、重下,还是暂停自动重试等待服务端修包。


4. 实验源码与运行验证 ​

关键源码 ​

关键参数 / 开关 ​

  • expectedVersion:远端声明版本
  • manifest.version:解压后 manifest 版本
  • expectedSha256 / actualSha256:模拟 hash 校验

运行方式 ​

bash
cd labs/shared/backend-data/resource-package-verifier
node resource_package_verifier.mjs

预期控制台运行输出 ​

text
[verify:size] ok
[verify:sha256] ok
[verify:manifest] version mismatch: expected=42 actual=41
[result] package rejected, keep activeVersion=v41

5. 对应知识库文档 ​

站点构建时间:2026/8/24 23:43:17