Skip to content

feat(maaend): 支持官方 ZIP 区间重建与自建站增量备用 - #1985

Merged
youngslin merged 1 commit into
AUTO-MAS-Project:devfrom
youngslin:feat/maaend-multi-base-delta
Nov 14, 2026
Merged

youngslin merged 1 commit into
AUTO-MAS-Project:devfrom
youngslin:feat/maaend-multi-base-delta

Conversation

@youngslin

@youngslin youngslin commented Nov 13, 2026 •

Copy link
Copy Markdown

摘要

  • MaaEnd 增量更新优先复用 MFW 的 HTTP Range 读取器,直接从官方全量 ZIP 重建原始 ZIP;复用的是读取器,不是 MFW 文件树安装流程。公共重建工具没有宿主依赖,本次不为其他专项开启该能力。
  • GitHub 路径不限起始版本,以实际读取量 40%、变化条目 3000 和网络条件决定是否回退;失败后尝试 数据仓库 #4 的 Action 增量,最后沿用全量下载。默认仍为全量,停止操作不会触发备用下载。
  • Action 备用包覆盖目标之前最多三个正式版;beta 必须有同号正式基准。客户端保留最近安装 ZIP 和最近正式基准,避免 beta 更新覆盖后续备用包需要的基准;两路都必须通过独立 GitHub 官方整包大小和 SHA256,之后才交给原有事务安装器。
  • 说明见 MaaEnd 双路径增量更新,包含范围、限制、缓存、重复/删除/回退文件及发布边界。保存与执行复用现有遥测结果入口,不新增逐区间事件。

路径与限制

路径 允许的起点 失败后的处理
GitHub Range 任意跨度的可信旧缓存 ZIP,包括跨多个 beta;不需要版本范围索引 再试 Action 自建站包
Action 正式版 如 3.0.0 / 2.9.0 / 2.8.0 → 3.1.0;更早版本不使用本站增量 全量
Action beta 3.1.0 正式版或 3.1.0b1…b7 → b8,实际重建使用缓存的 3.1.0 原始 ZIP 缺同号正式版、缺可信正式缓存、站点未发布或不匹配时全量

GitHub 只接受范围正确且完整的 206;返回 200 不读取整包响应体。实际读取预算包含头、中央目录和对齐开销,超过整包 40% 即退出;变化条目超过 3000 也退出。单次网络超时 30 秒。CDK 提供完整包备用源时,复用 MFW 网速保护,以 40% 读取上界保守估算 120 秒预算、180 秒实际网络耗时上限;没有较快备用源时不以这两项阈值打断持续传输的直连。

ZIP 是完整目标快照,不在当前安装上逐版叠补丁。重复数据复用,删除、改名和内容回退以目标快照为准;用户配置仍由现有安装器保护。CRC/大小只挑选复用候选,不能替代最终整包 SHA256;压缩字节不同导致 SHA256 不一致时丢弃重建结果。缓存最多两份原始 ZIP,约占两个整包大小;无缓存时允许先全量一次,不额外下载正式基准来伪装节省流量。

验证

  • Windows,锁定 Python 环境;实现提交 57651c30569e247731b9aa762c7480dfe7e6ee24,基于上游 70376570f。
  • 真实官方 x64 v3.1.0-beta.4 → beta.5:官方完整 ZIP 316,003,772 字节,Range 实际读取 38,917,565 字节(约节省 87.7%),复用 3035 个条目、取回 11 个变化条目。重建 SHA256 与官方完全一致:05b516305872c8b8a41fa0235d5ecfedef0157d1822dbe7147cc3112c00477a4。原型耗时 73.9 秒;生产读取路径再次复现同一结果。
  • 同一真实包由数据仓库新生成器产生 11,172,784 字节 v2 包,再由主程序实际 v2 解码器重建,亦通过上述官方 SHA256。此项是跨仓库字节协议验证,未绕过正式发布规则去声称没有同号正式基准也能使用 Action。
  • Range 重建包通过真实 apply_update 入口安装到独立临时目录,目标版本、安装回执和用户配置保留通过;不启动游戏、不更改用户实际安装。
  • 相关回归 107 passed:真实更新入口覆盖跨 beta/旧正式版的 Range、文件删除/回退/复用、200 响应后自建站接续、正式基准跨 beta 保留、损坏与错误基线回退、取消,以及既有 MFW 核心与预取回归。
  • ruff format --check .、相关文件 Ruff、uv lock --check、diff 和更新日志检查通过。完整后端回归 uv run --no-sync python -m pytest tests -q -p no:cacheprovider --tb=short:2097 passed、1 skipped、1 failed,17 subtests passed。唯一失败仍是此前已在未修改上游复现的 tests/utils/test_fluxdown_detect_managed_priority.py::test_incomplete_managed_fluxdown_falls_back,由本机已有完整 res/fluxdown-cli 优先于测试夹具外部目录触发;本 PR 未修改该实现或测试,没有新增失败。

发布边界

没有合并或触发站点生产发布;arm64 实包未验证。Action 仍需四个独立文件 ID 和授权密钥,旧 v1 发布包在新客户端上全量回退,旧客户端不识别 v2 也全量回退。

本次属于 #1949 同一 beta 未发布功能的补充,按仓库规则使用 skip-changelog,不重复增加碎片,不修改版本号或 CHANGELOG。

Copy link
Copy Markdown
Contributor

总体结论:可以合并

宝宝,这版没有为了少下载就放松安装校验,方向靠谱喵。CRC 和大小只用于挑选可复用的 ZIP 数据,重建结果仍须通过独立的官方整包大小和 SHA256 校验,再交给原有事务安装器;停止操作也不会误转成备用下载。审查范围内没有必须修改项。

正式基准单独保留、beta 不覆盖它,这处把后续备用包需要的来源想清楚了。站点 v2 未就绪时仍会回退全量,不把客户端合并绑在站点发布上,这样更稳妥。dot酱未执行项目代码或实包验证;arm64 实包仍待验证。

—— 少搬字节、不少校验的 dot酱敬上 🐾

@youngslin
youngslin merged commit 7483cba into AUTO-MAS-Project:dev Nov 14, 2026
10 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changelog 本 PR 没有用户可见改动,不需要 changelog.d 碎片

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants