Flutter 架构指南 —— windows 平台安装拆解

引言 ------ 桌面应用的「最后一公里」

第一次做 Flutter Windows 桌面应用的时候

arduino 复制代码
flutter build windows --release

build 完之后, Release 目录几十个 DLL、data、exe、资源文件......

这玩意怎么发给用户?

复制整个目录,然后双击 exe

真正交付用户之后,桌面应用真正困难的不是开发,而是安装。

此时基于安装器场景出发,就凸显出以下几点需求

  • 创建开始菜单快捷方式和桌面图标;
  • 在控制面板注册卸载入口;
  • 建立文件关联,支持双击产物图标能打开应用;
  • 支持覆盖升级,但阻止降级;
  • 在企业环境允许管理员为所有用户安装,在个人电脑上允许仅当前用户安装。

Windows 作为全球使用人数最多的 PC 平台,在面对客户端打包方案上同样存在多种选择

这些看起来是「基础功能」,但不同打包方案对它们的支持方式和程度截然不同; 摆在面前的选择主要有两个方向:NSIS VS MSIX

一、主流方案,NSIS VS MSIX

NSIS(Nullsoft Scriptable Install System)诞生于 2000 年,是一个命令式的安装器脚本引擎。开发者用类汇编的 .nsi 脚本精确控制安装器的每一步行为:解压哪些文件、写哪个注册表路径、创建哪种快捷方式、检测什么前置条件------一切行为可预期、可调试。

MSIX 是微软在 2018 年推出的现代打包格式,采用声明式清单(AppxManifest.xml)描述应用结构,运行时通过虚拟化层(文件系统重定向 + 注册表虚拟化)隔离应用,安装和卸载由操作系统统一管理。

flowchart TD A[当前阶段] A --> B[Installer<br/>Inno Setup] B --> B1[官网分发] B --> B2[自动更新] B --> B3[95%用户覆盖] A --> C[Portable ZIP] C --> C1[无管理员权限] C --> C2[学校 企业电脑] A -.企业客户出现.-> D[MSI] D --> D1[静默安装] D --> D2[批量部署] A -.未来生态化.-> E[MSIX] E --> E1[Microsoft Store] E --> E2[Win11生态]

NSIS 是把刀直接递给你,你想怎么切就怎么切;MSIX 是一套自动切菜机,省心但有边界。

flowchart LR subgraph MSIX[&#34;MSIX 运行时架构&#34;] A1[&#34;AppxManifest.xml&#34;] --> B1[&#34;Windows Deployment Service&#34;] B1 --> C1[(&#34;虚拟文件系统&#34;)] B1 --> D1[(&#34;虚拟注册表&#34;)] C1 --> E1[&#34;应用进程&#34;] D1 --> E1 E1 -. &#34;隔离&#34; .-> F1[&#34;真实文件系统&#34;] E1 -. &#34;隔离&#34; .-> G1[&#34;真实注册表&#34;] end subgraph NSIS[&#34;NSIS 运行时架构&#34;] A2[&#34;.nsi 脚本&#34;] -->|&#34;makensis 编译&#34;| B2[&#34;setup.exe&#34;] B2 -->|&#34;用户双击&#34;| C2[&#34;解压并执行安装逻辑&#34;] C2 --> D2[&#34;真实文件系统&#34;] C2 --> E2[&#34;真实注册表&#34;] C2 --> F2[&#34;快捷方式&#34;] end style MSIX fill:#f5f5f5,stroke:#0078d4 style NSIS fill:#f5f5f5,stroke:#333333

二、国内外使用差异

选安装包方案,不能只看技术先进不先进,还得看用户到底是怎么拿到这个软件的。

对于海外市场,或者 Microsoft Store 生态, MSIX 确实是一个很现代的选择:沙箱隔离、自动更新、卸载干净、权限模型也更规范。但放到国内 Windows 桌面软件场景里,情况就没那么理想了。

国内用户安装桌面软件,最常见的路径是:

搜索引擎搜一下 → 进官网 → 点下载 → 拿到 exe → 双击安装。

这个链路已经被用户教育了很多年,很少有用户想到通过应用商店下载安装软件。你给用户一个 EXE,他会下意识地双击,等待安装向导弹出来,点"下一步"。

虽然 MSIX 支持旁加载,不一定非要走 Microsoft Store,但旁加载本身就意味着你要处理证书、签名、安装策略、系统限制,以及用户机器上各种奇奇怪怪的安全提示。但对于普通用户来说,每多一个弹窗、每多一步配置,安装成功率就可能掉一截。

安装环境差异

要命的是,国内win版本清单多到足够做一个字典。很多政企、传统行业、内网办公机器,依然可能跑着 Windows 7、老版本 Windows 10,甚至是各种定制系统。MSIX 对系统版本有要求,最低也要 Windows 10 1809,这意味着天然会把一部分用户拒之门外。

而 NSIS 作为一个老辈子,是专门处理多系统差异安装的,最早可追溯到XP时代;

通过把安装包打成一个独立 exe,丢到 OSS 或 CDN 上,用户访问官网下载后双击安装。这个模型非常符合国内桌面软件的分发习惯,也最大程度降低了安装门槛。对很多业务项目来说,安装链路越短,用户流失越少,这比安装技术本身是否与时俱进来说更重要。

另外,NSIS 在国内的资料积累也非常深。从早期各种安装包制作教程,到现在大量博客、问答和脚本示例,遇到问题基本都能搜到类似案例。比如创建快捷方式、写注册表、处理卸载逻辑、判断运行环境、做静默安装,这些需求都很常见,团队上手成本也低。

所以这里并不是说 MSIX 不好。MSIX 的设计方向是对的,它更现代、更规范,也更适合 Store 生态和强管控分发场景。只是对我们当前面对的国内 Windows 用户来说,它带来的分发成本,暂时大于它提供的技术收益。

三、看重的点

回到工程决策本身,选择 NSIS,其实可以归结为一句话:

在这个阶段,可预测,比理想化更重要。

对于企业客户来说,我们更关心的是安装包能不能在各种 Windows 环境里稳定跑起来,而不是安装方案看起来有多现代。最终我们的判断是:NSIS 更适合作为当前阶段的主安装方案。它符合国内用户的下载习惯,兼容面更广,行为更透明,团队也更容易维护。

MSIX 当然不会被完全否定。它可以作为后续面向 Microsoft Store 或特定企业分发渠道的独立方案继续探索。但在现阶段,我们不会把它和 NSIS 混在一起用。因为它们解决的不是同一个问题,面向的也不是同一种分发场景。

一句话总结:

NSIS 解决的是"让大多数国内 Windows 用户顺利装上";MSIX 解决的是"在更现代、更受控的 Windows 生态里规范分发"。当前项目更需要前者。

flowchart TD A[Windows 安装包选型] --> B{主要分发渠道是什么} B -->|官网 / OSS / CDN 下载| C{用户系统环境是否复杂} B -->|Microsoft Store / 企业受控分发| D[优先考虑 MSIX] C -->|包含 Windows 7 / 老版本 Windows 10 / 定制系统| E[优先选择 NSIS] C -->|基本都是 Windows 10 1809 及以上| F{是否需要 Store 生态能力} F -->|需要沙箱隔离 / 自动更新 / 干净卸载| D F -->|更关注安装成功率和排障可控性| E D --> G[适合现代 Windows 生态下的规范分发] E --> H[适合国内常见 exe 下载与双击安装场景]

小结

NSIS Inno Setup
插件生态丰富 功能丰富(官方)
自定义自由度高 Pascal Script
社区丰富 文档健全
复杂的自定义安装 标准环境安装

简单说 NISI 可能对于界面以及官方应用商店支持并不多,但是相较于国内复杂的 win 版本环境,以及整个权限、写入、清除策略上支持更加集成化;

比如对于安装来说,NSIS 做的事情很直接------创建目录,就是在目标路径创建目录;写注册表,就是往真实注册表里写值;创建快捷方式,就是桌面上生成一个 .lnk 文件。它没有太多中间层,也不会把文件和路径藏在某个容器或虚拟化环境里。

这对排查问题非常重要。

比如用户反馈"安装完桌面没有快捷方式",用 NSIS 的时候,我们可以直接去桌面目录看快捷方式有没有生成,去安装目录看文件有没有复制成功,去注册表看写入是否正常。问题链路是直的,排查路径也是直的。

但如果分发环境本身比较复杂,再叠加 MSIX 的包模型、权限策略和系统版本差异,很多问题就会变成:"到底是安装脚本的问题,还是系统策略的问题,还是包容器行为的问题?"这对团队排障效率并不友好。

flowchart LR A[Flutter Build] -->B[NSIS] B-->C[官网发布] C-->D[自动更新] D-.企业部署.->E[MSI] D-.微软生态.->F[MSIX]
相关推荐
renhongxia14 小时前
Scaling Law撞墙了吗?大模型的“规模法则”走向何方
人工智能·深度学习·机器学习·架构·机器人
西西学代码6 小时前
Flutter---StreamBuilder案例
javascript·windows·flutter
2601_958352906 小时前
从智能安防到矿山预警:AR1105声源定位模组的行业应用与架构解析
人工智能·嵌入式硬件·架构·机器人·回音消除·声源定位
jiang_changsheng6 小时前
Conda 的默认环境创建优先级。
linux·windows·python
梦梦代码精8 小时前
BuildingAI:企业级开源智能体搭建平台的破局者
前端·docker·架构·开源·代码规范
黄一一9112438 小时前
硬盘健康监测软件!绿色便携版!电脑硬盘还能用几年?CrystalDiskInfo工具帮你提前避开数据丢失
windows·电脑·硬件工程·开源软件
Micheal_NET8 小时前
Microsoft Agent Framework-C#企业级 AI Agent 平台架构
人工智能·架构
咖啡八杯9 小时前
GoF设计模式——责任链模式
设计模式·面试·架构
吃饱了得干活9 小时前
从零设计一个高并发点赞系统:缓存+MQ异步持久化实战
java·架构
奇牙coding9 小时前
gpt-5.6-luna 调用报 400 bad_request 怎么办?同样的 messages 在 gpt-5.5 没问题——两处校验差异和修复写法
java·windows·gpt·ai