花笺1.1.0应用内更新揭秘:检查、下载、安装背后Windows四层保障机制全解析
【免费下载链接】floral-notepaper花笺,轻量优雅的跨平台桌面便签工具,支持 Markdown 编辑与预览项目地址: https://gitcode.com/gh_mirrors/fl/floral-notepaper
花笺(Floral Notepaper)是一款轻量优雅的跨平台桌面便签工具,支持 Markdown 编辑与预览。从 1.1.0 版本开始,它新增了应用内更新能力:在设置里一键检查、下载并安装更新,不用再手动去 Release 页面翻找安装包。更难得的是,Windows 端为这条更新链路准备了四层保障机制——安装回滚、注册表备份、进程校验和暂存目录保护,让"更新翻车"这件事有了兜底。本文带你完整看懂这套机制。
一、1.1.0 应用内更新带来了什么
在 1.1.0 之前,升级花笺要自己走一遍"打开 Release 页 → 找对应平台的安装包 → 下载 → 覆盖安装"的完整仪式。现在,这套流程被搬进了应用内部(详见 1.1.0 版本说明):
- ✅双更新源:同时支持 GitHub Release 与 Mirror酱 两个版本信息源,可填写 Mirror酱 CDK 切换下载通道;
- ✅自动 + 手动双模式:支持按设定频率自动检查更新,也可在"关于"面板手动触发;
- ✅完整可控流程:检查、下载、安装、取消一个不少,下载过程中随时可取消;
- ✅安装前自动保存:安装更新前,花笺会尝试自动保存所有未保存的笔记,多开的小窗便签一个都不会漏;
- ✅Windows 兜底:安装回滚、注册表备份、进程校验、暂存目录保护四重保障(下文详解)。
二、更新检查、下载与安装的完整流程
整个更新系统由 src-tauri/src/updater/mod.rs 统管,状态、日志、下载包都放在独立的updates目录里,分为downloads、staging、logs三个子目录。
更新检查:两个源,一个偏好
检查逻辑在 src-tauri/src/updater/check.rs 中。你可以设置"Mirror酱优先"或"GitHub 优先",应用会按偏好顺序查询版本信息,拿到最新版号、下载链接和文件哈希。自动检查的频率(多少小时查一次)在设置里可调,相关界面代码位于 src/features/update/UpdateSettingsSection.tsx。
安全下载:大小 + SHA256 双重校验
下载模块 src-tauri/src/updater/download.rs 不只是把文件拉下来:
- 下载中的任务可以随时取消(这是三种任务里唯一可取消的);
- 校验文件大小与SHA256 哈希是否和清单一致,防止下载到"半截"或被篡改的安装包;
- 下载产物默认保留 3 天,过期自动清理,不会越积越多。
安装前还会再验一次哈希和大小(见 helper.rs 的 validate_request),双保险。
三、Windows 四层保障机制全解析
Windows 下的安装由一个独立的"更新助手"(update helper)进程执行,核心代码在 src-tauri/src/updater/helper.rs。为什么需要独立进程?因为 Windows 不能覆盖正在运行的floral-notepaper.exe。主程序把接力棒交给助手后自己退出,助手完成安装再拉新版本重启——整个过程有四道防线。
第一层:安装回滚,失败自动恢复旧版
动手装新版之前,助手会先把整个安装目录原样备份到回滚存储区(见 prepare_windows_rollback_plan)。之后无论哪一步出事——安装程序报错、目标文件没出现、版本对不上、新程序启动失败——都会触发 rollback_windows_update:把备份目录里的旧文件完整拷回去,让应用恢复到你更新前的样子。
这意味着"装到一半蓝屏/掉电"这类场景下,重开机器后你面对的仍是能用(虽然旧)的花笺,而不是一堆残缺文件。
第二层:注册表备份,卸载信息也回得去
Windows 的"设置 → 应用"里能列出花笺,靠的是注册表Uninstall键。如果只回滚文件不回滚注册表,新版写入的卸载信息就和旧版文件对不上了。
因此助手会用系统自带的reg export把匹配的卸载注册表项导出成 .reg 备份文件(backup_windows_registry_state);一旦回滚,再用reg import原样导回(restore_windows_registry_backup)。文件、注册信息,一起回到原点。
第三层:进程校验,确保"真的退干净、真的装上了"
这一层管两头:
- 装之前:助手不会立刻写文件,而是先确认主进程确实退出了——先给 5 秒优雅缓冲,不够再发强制结束信号并等待(wait_for_process_exit),避免"程序没退干净,文件被占用写一半";
- 装之后:用 Windows API 直接读取新安装可执行文件的内嵌版本信息,与目标版本号逐一比对(verify_windows_installed_version)。版本号对不上就判定失败并回滚——防止"安装程序说成功了,其实文件还是旧的"。
第四层:暂存目录保护,助手自己也"自带保险"
助手可执行文件不会直接运行主程序目录里的原件,而是先复制到staging暂存目录(stage_windows_helper_copy,连运行时依赖的 DLL 一起拷)。好处是:即使安装覆盖了主程序目录,正在干活的助手也不受影响。
此外还有两个配套设计:
- 标记文件握手:助手用
ready/done/relaunching标记文件向主程序汇报进度,任何时刻断电,重启后都能从标记推断出"进行到哪一步了"; - 看门狗进程:主程序还会再启一个 Watchdog 模式助手盯着干活的助手(execute_watchdog)——万一助手卡死 30 分钟没交出完成标记,看门狗会把状态标记为失败并拉起旧版本,保证用户永远有东西可打开。
而每次启动时,staging里的旧暂存文件会被无条件清理(cleanup_staging_entries),暂存区不会残留"僵尸"文件。
四、小结:为什么这套更新值得信任
| 防线 | 防什么 |
|---|---|
| 安装回滚 | 安装失败 → 旧版文件完整恢复 |
| 注册表备份 | 卸载信息错乱 →reg import原样还原 |
| 进程校验 | 文件被占用 / 装完版本不符 |
| 暂存目录保护 | 助手自身被覆盖 / 卡死无响应(看门狗兜底) |
配合 SHA256 校验、双更新源和安装前自动保存笔记,1.1.0 的花笺把"更新"这件容易翻车的事,做成了一个环环相扣的闭环。官方也留了句话:链路较多,如遇到异常请保留现场并提交 Issue。
感兴趣的话,可以从 src-tauri/src/updater/ 目录读起:check.rs管检查、download.rs管下载、install.rs与helper.rs管安装——四层保障的实现都摊开在这几个文件里,欢迎深挖 🌸。
【免费下载链接】floral-notepaper花笺,轻量优雅的跨平台桌面便签工具,支持 Markdown 编辑与预览项目地址: https://gitcode.com/gh_mirrors/fl/floral-notepaper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考