通过阅读本文,你将了解如何利用 Advanced Installer 免费版结合 7zSD.sfx 来制作压缩的软件安装包。相比于 Advanced Installer 免费版自带的 CAB 压缩模式,结合使用 7zSD.sfx 的 lzma 压缩可以大幅减小安装包体积。
为了方便分发软件,我们可以将软件打包成可执行安装程序(安装包)。市面上用于制作安装包的软件有较多,在多次尝试之后,我发现使用 Advanced Installer 最为方便。Advanced Installer 这个软件具有完善的图形界面,学习成本低,少数几个步骤便可生成一个比较美观的软件安装包。然而 Advanced Installer 免费版只提供了 CAB 压缩方案,调用 LZMA 压缩需要升级到专业版。为了省钱,在一顿捣鼓之后,我找到了替代方法:使用 7zSD.sfx 来压缩安装包体积。
鉴于 Advanced Installer 使用较为简单,本文就不再赘述其使用方法。为了让后续 LZMA 打包起效果,需要在 Advanced Installer 的 Builds 页勾选「MSI with resources next to it」和「Place files unpacked in folders next to the MSI database」这两个选项。这样 Advanced Installer 就不会调用默认的 CAB 压缩,而是将资源文件夹复制到 MSI 安装包同级目录。一般来说,输出文件夹叫做「XXX-SetupFiles」。
接下来,使用 7-Zip 将这个「XXX-SetupFiles」文件夹打包成一个 7z 压缩文件,例如「archive.7z」。然后,我们在同级目录下新建一个叫做「config.txt」的配置文件,如下:
;!@Install@!UTF-8!
Title="XXX Setup"
ExecuteFile="XXX-SetupFiles\XXX.msi"
;!@InstallEnd@!
这个配置文件其他用法可以参考 Usage examples - olegscherbakov.github.io - 20230505,上面这段就表示简单运行「XXX.msi」,不要忘了将「XXX」替换成你的安装包名称。接下来,为了方便打命令行,把「sdk bin」目录下的「7zSD.sfx」文件复制到「archive.7z」的同级目录。打开命令提示符 CMD,注意这里务必使用 CMD,使用 PowerShell 会报错。转到「archive.7z」所在目录,输入下面这条指令:
copy /b 7zSD.sfx + config.txt + archive.7z Setup.exe
这样便生成了我们所需要的「压缩的软件安装包」。注意,使用「sdk bin」目录下的「7zSD.sfx」得到的可执行文件默认权限提升才能运行。如果软件安装包不需要权限提升,需要通过嵌入「清单文件」的方式修改「7zSD.sfx」。下面简单讲一下这种方法。
首先,需要新建一个「清单文件」,作为演示将这个文件放在「7zSD.sfx」的同级目录下,命名为「no-admin.manifest」,注意,接下来的操作会直接修改「7zSD.sfx」,请先做好备份。
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,
PerMonitor</dpiAwareness>
</asmv3:windowsSettings>
</asmv3:application>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
</application>
</compatibility>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
安装「Visual Studio」并勾选「使用 C++ 的桌面开发」,保留默认选项。之后打开开始菜单中的「Developer Command Prompt」,转到「7zSD.sfx」所在目录,输入如下指令:
mt.exe -manifest no-admin.manifest -outputresource:7zSD.sfx;#1
如果只安装了「Windows SDK」,你也可以在其安装目录下的「bin/*/x86/」找到「mt.exe」。通过执行这条命令便将「清单文件」嵌入到「7zSD.sfx」中去了。如果你只是想要一份不要管理员权限的「7zSD.sfx」,可以访问我的公开仓库 Releases · felixmaker/sfx-asinvoker - Github - 20230505 进行下载。
最后提一下,Advanced Installer 最后支持 XP 的安装包制作的版本是 15.9,如果需要下载历史版本,可以参考 Advanced Installer 历史版本下载 - CSDN - 20230505。