什么是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!