s-blog

拆解一个超大 Electron 桌面安装包:从封装层到可验证的瘦身路径

ssssmy · 2026-07-16 · 5 min · Electron

拆解一个超大 Electron 桌面安装包:从封装层到可验证的瘦身路径

桌面 IDE、工业工具和离线资源型应用很容易长成“多 GiB 安装包”。遇到这类问题时,第一反应往往是把压缩级别调到最高;但真实的主因通常不是压缩器,而是被完整带入发布目录的资源、调试产物与重复数据。

本文记录一次经过脱敏的实物分析方法。文中不包含产品名称、版本、内部路径、客户资源、设备型号或精确业务数据。

先看封装层,不要先猜内容

分析的对象是一个单文件 Windows 安装包。检查 PE 尾部数据后发现它有两层结构:

  1. 外层是 7-Zip SFX 启动器;
  2. 外层携带内层安装器和多个分卷数据文件;
  3. 内层是 Inno Setup,并使用 LZMA2 固实压缩与分卷输出;
  4. 外层条目的压缩方法是 Copy

这说明外层的职责只是把“多个安装文件”包装成一个可分发 EXE,再解压到临时目录并调用内层安装器。它几乎不产生额外压缩收益,也不是体积膨胀的根因。

一个很实用的判断原则是:

如果内层已经使用 LZMA2/Ultra 和 Solid Compression,继续调整压缩等级通常只会显著增加打包时间,不能替代内容治理。

用落盘内容解释安装包,而不是只看 EXE

下一步应以不执行安装程序的方式完整解包,并按实际文件字节数统计。对于大型 Electron 应用,通常会得到类似下面的层次:

  • Electron 运行时与主程序:占比有限;
  • 编辑器内核、内置扩展和原生 Node 模块:中等;
  • 模型、离线包、手册、模板、设备运行环境等领域资源:最大;
  • 调试符号、映射文件和编译中间产物:不应进入正式发布包。

这一步尤其重要:安装包经过压缩后,许多看似巨大的文本、符号文件在 EXE 中并不等比例占空间;而 ZIP、PDF、媒体、二进制固件等已压缩内容,几乎无法再从压缩算法中获得收益。报告中必须明确区分“安装后磁盘节省”和“最终 EXE 缩小量”。

四类最值得检查的问题

1. 发布规则把 staging 目录整体带入

许多安装脚本使用类似 Source: "*" 的规则递归复制整个构建目录。这很方便,但也意味着只要 staging 中出现以下内容,就会进入正式包:

  • .pdb.map.lib.ilk.obj
  • 前端源码目录和已编译的 dist 同时存在;
  • 临时归档、旧备份、测试素材;
  • 开发期的原生库与调试版 DLL。

更可靠的做法不是在源目录手工删除文件,而是在发布 staging 阶段执行清理,并维护一份明确的发布白名单或排除规则。

2. 同一内容被复制到多个产品/插件目录

文件名相同不代表内容相同;反之,文件名不同也可能是相同内容。因此应先缩小候选范围,再做内容哈希验证:

  1. 以“文件长度 + 文件名”分桶;
  2. 对有多个副本的桶计算 SHA-256;
  3. 只把哈希完全一致的副本计为已证实重复;
  4. 记录每组的样本路径、份数、单份大小和可回收落盘空间。

在这次分析里,最大的重复组集中在通用固件、运行库、图形库和设备描述资源。它们常被按照不同设备或插件目录重复复制。直接删除某一个路径风险很高,因为运行时代码可能依赖既有相对路径;正确路线是收敛到共享资源目录、维护兼容映射,或在安装时创建硬链接,再对离线、升级和设备流程做回归。

3. 已安装扩展与离线扩展归档双份交付

扩展生态中常见两种形态同时存在:一个目录中是已解压、可直接加载的扩展;另一个目录中又保留同版本的 ZIP/VSIX 归档,用于离线安装或恢复。这未必是错误,但必须回答一个问题:正式安装后是否真的还会使用该归档?

如果答案是否定的,归档应改为可选资源或按需下载;如果答案是肯定的,应明确其用途并避免同一能力在多个位置重复保留。

4. 已压缩的大资源被当作“压缩参数问题”

离线安装包、PDF 手册、模型文件、视频或大型二进制数据通常已经高度压缩。再调高安装器压缩等级不会带来预期收益。对这类资源,应从产品交付模型入手:

  • 基础版只保留启动和核心编辑能力;
  • 大模型、离线模板、调试工具做成可选包;
  • 首次使用时下载,并提供内网或离线镜像;
  • 用版本清单管理资源兼容性与回滚。

一个可复用的分析流程

识别外层格式
  -> 列出所有分卷和内层安装器
  -> 无交互解出内层内容
  -> 按目录、扩展名、最大文件聚合
  -> 扫描调试/构建产物
  -> 用 SHA-256 证实重复文件
  -> 区分落盘节省与安装包节省
  -> 清理 staging 后重新打包、启动与功能回归

建议把最后两步固化到 CI:每次发布都生成大小清单,按目录和扩展名比较上一个版本;对调试产物、异常大文件和超阈值增量直接报警。这样安装包体积从一次性的“救火问题”,变成可以持续治理的发布质量指标。

结语

大安装包的优化顺序应当是:先证实内容来源,再移除不应发布的产物;随后消除可验证的重复;最后才讨论功能分包和按需下载。压缩工具很重要,但它无法修复资源组织和发布边界的问题。

installer-analysis-report-screenshot.png

原文链接:https://www.ssssmy.com/blog/analyze-large-electron-installer-size