通过阅读本文,你将了解如何利用 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

最后修改:2024 年 03 月 02 日
如果觉得我的文章对你有用,请随意赞赏