Repository navigation
v0.3.2
[0.3.2] — 2026-09-26
把增量补丁真正接进更新流程,并让 CI 自动出补丁。本版之后,从 0.3.x 升级只需下载
1.6 MB 左右(整包的 5% 上下),而不是 30 MB。
Added
- 增量补丁接入更新流程:
UpdateInstaller.download()现在先试补丁——
用本机已安装 APK(applicationInfo.sourceDir)的 sha256 去比对补丁元数据里的
baseSha256,匹配就下补丁并拼装;任何一步不成立(没有补丁资产、基线不匹配、
下载失败、拼装校验不过、签名不符)都静默回退整包。
补丁是加速手段而不是必经路径,它失败绝不能让用户更新不了。
拼装结果先比targetSha256(ApkPatchApplier内部)再比签名证书 ——
两道校验与整包路径完全一致,安全性没有放松。 - CI 自动出补丁:新增
.github/workflows/release.yml,打v*tag 时自动
跑测试 → 构建两个 ABI → 对上一个 release 的同 ABI APK 生成增量补丁 →
创建/更新 release 并上传 APK + 补丁(patch-<from>-to-<to>-<abi>.{zip,json})。
发布说明从 CHANGELOG 同版本段落抽取(tools/extract_release_notes.py,
段落缺失时写占位说明而不是留空);发布前校验 tag 与versionName一致。 UpdateChecker.pickPatchAssets():从 release 资产里挑出patch-*.json,且配对的
.zip必须存在(纯函数,5 例单测)。不按 ABI 过滤 —— 该用哪份由baseSha256
决定,名字里的 arch 只是辅助。- 更新弹窗可读化:新增
ReleaseNotes.toPlainText(),把发布正文的 Markdown
转成对话框里能读的文本(标题 → 【】、引用去>、加粗/行内代码/链接去标记、
表格 →·连接、首个含版本号的标题丢掉),正文区改成固定高度 + 可滚动、显示全文。
Fixed
- 更新弹窗把原始 Markdown 直接显示、而且被截断(真机截图实锤):原来
Text(info.body.take(400))—— 用户看到的是## v0.3.1-fix、>、**修复向**、
| 表格 |,正文还只露出开头几行。
坑:发布正文是硬换行的,**加粗**很容易跨行,逐行跑正则会漏掉那一对
(真机就是这么漏的)→ 必须先按段落合并软换行再清标记。 - 测试基建:
-Dkaze.*现在会透传给测试 JVM(此前 Gradle 的-D只作用于守护进程,
两条"吃真实产物"的用例——真实补丁互通、真实发布正文——一直在静默跳过,
绿的但什么都没验)。