乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - 现代应用包格式MSIX
什么是MSIX
MSIX为提供可靠、可信、迅捷的应用安装、卸载、更新体验而生。
MSIX是一种Windows应用包格式,它将
MSI
、.appx
、App-V
和ClickOnce
的最佳功能组合在一起,提供新式的可靠打包体验。
让客户及时了解应用程序的最新版本是保留客户和维持好评的关键。MSIX支持应用无缝安装和保持最新状态,而无需运行单独的应用更新过程。你可以完全控制更新的方式和时间计划。
2018年,微软首次在Build大会上宣布了新的容器文件格式MSIX,这是一种Windows应用包格式,可为所有Windows应用提供新式打包体验。
MSIX包格式通过对Win32、Wpf、WinForms添加新式的现代化打包部署特性来实现已有应用的打包、安装。
2019年,微软首席项目经理John Vintzel的推文,Windows 10 Build 18956开始将会把MSIX当做是原生文件格式,而且在该版本中的开发者模式设置中已经得到了简化。在Windows 10 20H1最新的预览版中,微软已经在开发者设置中移除了“Microsoft Store apps”和“Sideload apps”,之后只有“开发者模式”这样一个选项。
微软在不同的操作系统际代与时俱进的推出了多种应用包格式,2021年,从Windows 11开始,MSIX成为Windows 11真正的原住居民,不仅原生支持MSIX的旁加载安装,而且通过Microsoft Store平台自动补缺MSIX中的依赖项,有效降低了MSIX的打包体积,实现公共依赖组件的空间复用。
系统际代 | 应用包格式后缀 |
---|---|
Windows 8.1、7、Vista、XP及更早时代 | .exe 、.msi |
Windows 10时代 | .appx 、.appbundle 、.eappx 、.eappxbundle |
Windows 11时代 | .msix 、.msixbundle 、.emsix 、.emsixbundle |
核心优势
- 可靠性,安装成功率达到99.96%。
- 网络传输优化,MSIX只会下载64k大小的数据块,可以减轻对网络带宽的影响。
- 磁盘占用优化,使用MSIX时,不会在应用之间复制文件,Windows将跨应用管理共享的文件。
内部结构
在MSIX包内部,由"程序包有效负载(Package Payload
)"、"指纹文件(Footprint Files
)"两大块组成。
其中"程序包有效负载(Package Payload
)"块是创建MSIX包时,应用所包含的代码文件和静态资产。
而"指纹文件(Footprint Files
)"的核心分别由四个关键文件组成,它们分别是:
- "应用清单文件(
AppManifest.xml
)",它包含应用安装、更新时显示所需的应用信息,以及程序包标识、依赖项、所需功能权限、可视元素、扩展点。 - "应用映射文件(
AppxBlockMap.xml
)",它包含应用的文件列表、包中每个数据块的索引和加密哈希,它是MSIX包实现增量下载和验证的基础。 - "应用签名文件(
AppxSignature.p7x
)",它包含创建MSIX包的签名信息,包含签名证书的持有者和公钥信息,用于下载安装验证。
我们来看一个实际的案例,这里以WSA的MSIX安装包MicrosoftCorporationII.WindowsSubsystemForAndroid_1.7.32815.0_neutral_~_8wekyb3d8bbwe.msixbundle
为例,
- "应用清单文件(
AppManifest.xml
)"的内容大致如下:
它主要是由"身份信息(Identity
)"和"包块信息(Packages
)"两个区块组成,其中"单个包块信息(Package
)"中详细记录了包块类型、包块版本、包块架构、包块文件名、目标设备体系等信息。
- "应用映射文件(
AppxBlockMap.xml
)"的内容大致如下:
它主要是由很多个"文件信息(File
)"区块组成,每个区块记录了文件相对路径、文件大小、分块压缩后大小、分块加密哈希和文件加密哈希,每一个哈希块<=64KB。
- "应用签名文件(
AppxSignature.p7x
)"的内容暂无法解开,由一些二进制数据组成,从信息痕迹来看,应该是包含了签名证书的持有者信息和签名公钥信息。
向下系统的兼容性
https://docs.microsoft.com/zh-cn/windows/msix/msix-core/msixcore
从Windows 10 v1709开始已经引入了对MSIX包格式的支持,如果要向下兼容覆盖到更老的系统版本,甚至Windows 7,可以通过内置并添加MSIX Core的支持来实现。它是一个开源项目,转为以下不支持MSIX的系统版本构建:
- Windows 7 SP1
- Windows 8.1
- Windows 10 1507
- Windows 10 1607
可在使用"MSIX打包工具(MSIX Packaging Tool
)"时勾选"添加支持MSIX Core来兼容更早Windows版本"的选项。
面向跨平台的需求
https://docs.microsoft.com/zh-cn/windows/msix/supported-platforms
通过开源项目MSIX SDK,允许并支持开发者在任何平台普遍使用MSIX包格式,该SDK可以被集成到任何支持插件或者扩展的跨平台客户端应用中,客户端开发人员可以基于Windows平台提供的应用扩展模型,使用非Windows平台的MSIX SDK,如macOS、iOS、Android和Linux。
MSIX SDK提供的相关API文档可见:https://docs.microsoft.com/zh-cn/windows/win32/appxpkg/interfaces?redirectedfrom=MSDN
支持MSIX包的第三方安装程序
https://docs.microsoft.com/zh-cn/windows/msix/desktop/desktop-to-uwp-third-party-installer
市面上主流的第三方安装程序解决方案已经陆续提供了对MSIX包的支持,具体清单如下:
- Advanced Installer,https://www.advancedinstaller.com/desktop-bridge
- Apptimized Platform,https://apptimized.com/en/product/workspace/
- appCURE,https://www.appcure.io
- Capture(Access IT Automation),http://info.accessitautomation.com/ty-evergreen-it-webinar-0
- Cloudhouse,https://cloudhouse.com/msixpr
- FireGiant,https://www.firegiant.com/products/wix-expansion-pack/msix
- Infinity Evergreen,https://infinityevergreen.com/automated-packaging/
- Liquit Setup Commander,https://www.liquit.com/msix-readiness/
- InstallAware,https://www.installaware.com/msix.htm
- InstallShield,https://www.flexera.com/company/news/press-releases/Flexera-Launches-Support-for-Microsofts-MSIX.html
- PACE Suite,https://pacesuite.com/convert-exe-to-msix/
- RAD Studio,https://www.embarcadero.com/products/rad-studio/windows-10-store-desktop-bridge
- RayPack Studio,https://raynet.de/en/msix/
- Rimo3 Cloud,https://rimo3.com/rimo3cloud/?msix-guide
- CamWood,https://camwood.com/application-services/
MSIX与Flutter Windows桌面版
通过命令行可以从Flutter的Windows桌面版构建打包MSIX包,这是一个开源探索项目,非官方!
创建MSIX应用包
下载安装MSIX打包工具
"MSIX打包工具(MSIX Packaging Tool
)"支持在Windows 10 v1809及其以上系统版本中安装和使用,可通过微软商店地址进行安装。
https://www.microsoft.com/p/msix-packaging-tool/9n5lw3jbcxkf
基于现有应用安装包创建MSIX应用包
- 第一步,打开"MSIX打包工具(
MSIX Packaging Tool
)",进入首页,可以选择"创建应用包(Create App Package
)"的功能项。
- 第二步,这里可以选择打包方式,包括从当前计算机创建、从远程计算机创建、从本地虚拟计算机创建三个选项。
- 第三步,创建新包之前的系统准备,工具将为你安装好MSIX打包工具的驱动、临时关闭系统更新、为重启系统准备,还可以勾选关闭系统搜索功能。
- 第四步,选择已有安装包的文件(如果没有,可以不填这项),并且可以设置静默安装的参数,同时还需要选择签名的方式(建议签名,否则后续安装会被提示不被信任)。
- 第五步,填写MSIX包的包信息,首先是需要指定一个
Pacakge Name
,建议采用公司名+产品英文名组合中间以.
号隔开,比如Microsoft.Todo
; 然后是填写MSIX包的显示名称,这里可以填写产品的名称即可,将在安装时显示它,比如Microsoft Todo
。发布者名称,如果上一步有指定签名的话这里会自动显示签名证书持有者的名称,且不让修改,其格式是:CN=Name
,比如CN=Microsoft
;同时还要填写发布者显示的名称,如果你是个人那就填写个人名称,如果是公司,建议填写对外的统一名称,将在安装时显示它,比如:Microsoft Inc.
; 接下来就是包的版本号,这个根据实际情况填写即可;还可以填写包的描述,建议填写一行最能代表产品是干什么以及突出亮点的总结性介绍文案即可;然后就是安装目录,这里是告诉包安装工具,等下应该去监控哪个目录的变更情况,我们可以填写已知的程序包默认安装目录位置,通常它在C:\Program Files\
之类的。最后我们可以视情况勾选是否往下兼容,即覆盖对Win10 v1709更早系统的支持。
- 第六步,执行安装,如果前面我们选择了已打包的安装包,那么它会根据我们指定的安装参数开始该安装包的安装流程,如果没有指定,你甚至可以手动复制一些文件及文件夹到上一步被监控的安装目录,也能达到同样的效果,总之,在这个环节,我们对文件的修改都会被打包工具驱动监控到。不出意外的话,只需要等待Next按钮被点亮,就意味着安装完成了。
- 第七步,选择安装后第一次启动目标文件,打包工具驱动会自动监控并且扫描出安装目录下有价值的
.exe
作为这里的目标清单,通常我们知道那个文件是我们的启动文件,如果这里列表存在多个,那么我们选中我们知道的那个,然后点击Next即可。
- 第八步,确定停止监听和收集安装信息,继续往后执行。
- 第九步,查看和列举应用所创建或依赖的Windows服务,有些应用是会创建服务的。
- 第十步,创建之前的最后确认,以及指定MSIX包创建后的存储目录位置,如果我们前面自定义了安装参数,那么会多生成一个模板文件,如果你需要单独选择模板文件位置,也可以勾选那个复选框。完成以上信息确认之后,我们就可以点击Create按钮。
创建成功之后,我们可以看到MSIX包的最终位置,如果你想查看打包过程的相关日志,也可以根据这里的指引来操作。
如果要进行包的修改,也可以通过这个工作来操作即可。
最终,在我们指定的输出目录,我们将找到.msix
包文件和_template.xml
模板文件。
使用MSIX部署配置
什么是MSIX部署配置
https://docs.microsoft.com/zh-cn/windows/msix/toolkit/msix-toolkit-appinstallerfilebuilder
"MSIX部署配置文件(.appinstaller
)"可用来为MSIX包提供部署配置信息,它是结合"应用安装程序(App Installer
)"来实现功能的,它本质是关于MSIX包安装、升级、下载源、策略的XML描述文件,调用"应用安装程序(App Installer
)时,可以指定配置信息源(source
),它将拉取并解析MSIX包的部署配置,以便用户执行后续操作。
它的一个巨大优势在于,我们不再需要自构建独立的下载安装器了,只需要创建部署配置信息文件,在软件的下载页中,用户点击应用安装程序的协议并且带上部署配置源地址,即可轻便的完成整个下载及安装MSIX包的流程。
创建MSIX部署配置
通过工具AppInstaller文件生成器工具可以轻松基于已有的MSIX包创建部署配置文件(.appinstaller
)。
- 安装后,打开它,首先我们需要选择一个主MSIX包,这里必须存在的,我们可以直接选到一个已有的MSIX文件,通过Get Package Info自动解析相关的信息出来。
需要注意的是,如果你要在线发布的话,这里的File Path建议替换成在线的URL地址。
-
接下来,我们可以根据情况,添加可选包、修改包、关联包、依赖包这些。
-
最后,切换到Summary这里,我们需要填写一个部署配置文件的地址,这里也是建议填写在线的URL地址,一般来说格式:
https://hostname/xx/companyName.productName.appinstaller
,并且要填写当前配置文件的版本号,以便后续做检查更新。
- 接下来,我们点击Generate生成按钮,选择部署配置文件的保存地址和填写最终文件名。
- 恭喜你,创建成功。
- 为了满足好奇心,我们不妨用VsCode来查看下部署配置文件(
.appinstaller
)内部的具体内容
- 接下来,如果使用,如果你有Web服务器,接下来我们只需要放置一个带点击的按钮即可,这里使用应用安装程序(
App Installer
)的公开协议ms-appinstaller:
,并且指定配置源source
即可。
<html>
<body>
<a href="ms-appinstaller:?source=https://hostname/xx/companyName.productName.appinstaller">Get App Download</a>
</body>
</html>
点击我们设计的Get App Download
会弹出一个确认打开协议的弹窗,点击确定即可。
- 如果顺利的话,应用安装程序(
App Installer
)将会被吊起,并且做出响应,在这个界面会显示MSIX部署配置中那些基本信息。
- 如果用户点击
Install
,应用安装程序(App Installer
)将根据部署配置所描述的策略,先下载后安装MSIX包。
- 整个过程,将非常的可靠和迅速,不久,你将看到已安装程序被启动了。
探索MSIX包运行机制
https://docs.microsoft.com/zh-cn/windows/msix/desktop/desktop-to-uwp-behind-the-scenes
MSIX应用包格式不仅要简化分发、安装的体验,还对应用的安全、隔离性、可卸载性做了更好的设计。通过MSIX打包的应用将被安装到C:\Program Files\WindowsApps\package_name
目录下,之前做过UWP应用的童鞋可能知道,这里是UWP这类商店应用的默认安装位置,并且对用户来说是不可见的。
应用通过MSIX打包、分发、安装之后,应用的软件文件被操作系统设置成了只读并严格锁定,如果这些文件被篡改,系统将阻止应用启动。
通过MSIX包格式安装的应用在一个轻型的应用容器中运行,应用的进程及其子进程都在该容器内运行,并使用文件系统和虚拟化注册表进行隔离。MSIX包应用可以向往常一样读取全局注册表,但是其写入自身虚拟注册表和应用程序数据文件都将在卸载时被删除掉。其他应用无法访问MSIX应用的虚拟注册表和虚拟文件系统。
对于文件系统读写而言,应用程序对AppData目录的写入将会看似在真实写入AppData位置,实际上被重定向了,但是卸载时该数据将被删除。
Windows常用文件夹System32、Program Files、Program Files(X86)等将被虚拟化,从应用角度看,以为是C:\Windows\System32\vc10.dll
的文件实际位于C:\Program Files\WindowsApps\package_name\VFS\SystemX86\vc10.dll
,但是应用自身没有感知。对其他不允许写入的文件夹位置,操作将被忽略。
应用内含名为registry.dat
的虚拟注册表文件,它用来充当HKLM\Software
的等效项,以实现应用的的注册表虚拟化和隔离。
正是得益于,前面说的虚拟文件系统和虚拟注册表,将确保卸载应用时,能彻底删除C:\Program Files\WindowsApps\package_name
目录的所有文件及相关应用重定向。
使用案例
Schneider Electric - 企业部署案例
Schneider Electric: 我们需要频繁发布和部署开发运营软件公司,但每个实用工具公司想要管理更改,并单独确定要向用户发布的应用程序版本以及何时发布。完成到 MSIX 的升级后,将能够删除一些第三方依赖项,并离将应用程序更新到.NET Core 3.0更近一步。
Trend Micro - 企业部署案例
Trend Micro: 在Cleaner One中,Electron Chromium包大小较大的引擎,使得下载和升级整个包很困难,尤其是在存在网络连接问题时。 由于MSIX是Windows上的新式打包方法,并且支持增量升级
Bilibili - 国内尝鲜案例
Bilibili: 从现在开始,哔哩哔哩的Windows版将直接通过MSIX部署配置文件进行分发,从应用下载官网点击Windows版下载按钮,在弹出的对话框点击确定,即刻吊起Windows 11/10原生的应用安装程序界面引导下载和安装流程,非常的便捷和迅速,得益于Windows对MSIX旁加载的原生支持,现在我们可以同时在自有渠道和商店渠道进行发布了,给用户提供更灵活的选择。
Mozilla - 社区尝鲜案例
Mozilla:Mozilla Firefox火狐浏览器近日已上架Win11/Win10应用商店,微软已经更新了其商店政策页面,要求Win11商店的网络浏览器“必须使用Chromium或Gecko开源引擎”,而Gecko就是Firefox火狐浏览器所使用的引擎。通过MSIX打包的火狐浏览器已经提供下载了。
ms-appinstaller:?source=https://ftp.mozilla.org/pub/firefox/releases/94.0/win64/multi/Firefox%20Setup%2094.0.msix
MSIX与Windows 11右键菜单兼容的妙用
NanaZip
NanaZip:NanaZip它基于大名鼎鼎的“7-Zip”,Win11的新右键菜单使用了Fluent Design设计,颜值更高,布局也作了大幅调整,将一些常用的功能,隐藏了起来,需要点击“显示更多选项”才能找到。和Win10相比,Win11的右键菜单更加简洁,但却在很多场合中使用不便。例如安装了压缩软件后,呼出右键菜单后,就需要多点击一次“显示更多选项”才能找到压缩相关选项,不像Win10那样直接在右键菜单就能操作。NanaZip的亮点在于通过MSIX打包对Win11的适配。安装了NanaZip后,即可设置将其中的功能集成到Win11的右键菜单当中。接着,右键点击某个文件或者文件夹,就可以看到NanaZip的二级菜单,展开压缩相关的各种功能了。
ms-appinstaller:?source=https://github.com/M2Team/NanaZip/releases/download/1.0-Preview3/40174MouriNaruto.NanaZip_1.0.46.0_gnj4mf6z9tkrc.msixbundle
WinRAR
WinRAR: WinRAR是一款用于管理压缩包文件的共享软件。其算法由作者尤金・罗谢尔研发,享有原创专利。而现在这款软件已成功支持Windows 11现化的右键菜单,它并没有通过MSIX打包,而是内置了处理右键菜单兼容性的MSIX包,也实现了Win11右键菜单的兼容。
Windows 11 / MSIX 爱好者交流群
参考
- Win10知识普及:对比exe,appx有什么优势?
- MSI-百度百科
- Windows安装新格式:继msi、exe的又一种安装程序MSIX
- Windows 10引入全新安装包格式MSIX:超越所有!
- 如何评价「微软Windows 10全新MSIX文件格式」?
- 微软宣布Win10全新MSIX应用文件格式:.appx + MSI
- Win11/10 全新开发,微软 Windows App SDK 1.0 预览版 3 发布:首支持 Win11 风格,非 MSIX 打包的 WinUI 3 应用部署
- 微软Win10 20H1改善应用程序旁加载,新增支持MSIX格式
- 全新打包,微软MSIX Packaging Tool Win10 UWP正式版发布
- 微软MSIX Packaging Tool Win10 UWP版发布:全新打包
- Win10 SDK预览版17686下载:支持MSIX文件包格式
- 微软推出 .NET core 3.0以及新的MSIX容器文件
- Use the MSIX SDK to distribute an MSIX package on non-Windows 10 platforms
- 受支持的平台
- Trend Micro
- 在 Windows 11 上,为增强应用功能而可以执行的最常见的 11 种操作
- Windows 10 20H1功能更新将默认启用旁加载功能
- 使用 MakeAppx.exe 创建 .MSIX 包或捆绑包
- 完美契合 Win11 右键菜单,这款压缩软件推荐给你
- Firefox 火狐浏览器上架微软 Win11/Win10 应用商店
- 向未打包的桌面应用授予标识
- 微软 Win11 全新右键菜单获开发者支持,WinRAR 已完成适配:无须再忍受二级菜单
- MSIX - First look and my two cents!