Skip to main content

减少Qt应用程序的二进制文件大小 - 第3部分:更多平台

Comments

在macOS、iOS、Windows、Android、WebAssembly和Linux上优化Qt构建。

第1部分 ,我们介绍了 Qt大小优化指南第2部分 介绍了Raspberry Pi(Linux)上的一个具体示例

Linux是Qt支持的众多平台之一,但在其他平台上如何优化大小呢?有些配置选项依赖于平台 ,并不总是可以在不同平台间通用

在本篇博客中,我们将介绍其他平台。主要目的是提供一些参考功能集,供您在配置中作为起点使用。

参考应用程序

在创建最小化的 Qt 配置时,您需要决定哪些功能必须保留。了解越清楚,就越能精简不必要的功能,或做出可以接受的性能或安全性取舍。为此,我们选择了几个 Qt Quick 示例应用程序,它们可以在该配置下正常运行:

  • Coffeemachine- 与之前的博客进行比较
  • Colorpalette Client --使用网络和 https
  • Gallery- 大多使用 Qt Quicker Controls
  • Calqlatr
  • Simple application(简单应用)-- 一个极简参考应用程序,仅包含一个 QML 窗口和文本元素(“Hello World”) 

平台

我们在以下六个平台上测试了配置:

代码库基于最新的 Qt dev 分支(即将发布的 Qt 6.10)。大多数为编译最小配置所需的修复也已回移合并到 Qt 6.9 Qt 6.8

结果

CI配置最能概括所生成的配置。不同平台上的配置大部分选项相同,但也存在差异

值得注意的是,大多数构建都是静态构建。静态构建意味着应用程序、Qt库和Qt插件都被编译进了一个单一可执行文件中。静态构建使编译器和链接器能够进行强有力的大小优化,因为它们可以看到整个二进制结构。Android是个例外,因为 Qt for Android 目前不支持静态构建

图例:

  • 参考:默认配置下构建的发布版本应用程序 
  • 参考已剥离:剥离符号后的参考应用程序 
  • 最小化:使用最小配置构建的应用程序
  • 最小化已剥离:剥离符号后的最小化应用程序 

MacOS (Sequoia 15.2):

Picture

iOS (18.2):

Picture

Linux (Ubuntu 24.04):

Picture

WebAssembly (emsdk 4.0.7):

Picture

值得注意的是,WebAssembly配置直接使用了 LTO (链接时优化) 链接器标志,因为Qt configure提供的-ltcg选项遇到了编译器错误。该bug最近已经得到修复,因此今后也可以在该平台上使用ltcg选项。

安卓(NDK 26.6.1):

Picture

因为 Android 的构建过程默认会剥离二进制文件,因此没有单独“剥离”版本。

Windows (11, MSVC 2022):

Picture

在 Windows 上没有单独的剥离版本,因为使用 MSVC(而非 MinGW)时,通常不使用或不需要符号剥离。

横向对比 

我们也来看下不同平台下应用程序大小的横向比较。首先是最大的应用程序: 

Colorpalette:

Picture

然后是最小的应用程序,simple app(简单应用):

Picture

在所有平台上,大小优化都有显著影响。不出所料,macOS和iOS的大小几乎完全相同。Android .apk的文件体积最大。这可能是由于缺乏静态构建支持,而打包(androiddeployqt)可能会部署比实际需要更多的组件。幸运的是,后者可以手动调整,请参阅本博文

进一步优化

我们选择了一个能确保所选参考应用程序正常运行的最小配置。但实际生产应用程序有特定需求,可以进一步优化。下面是一些例子:

  • 如果应用程序不需要网络功能,可将其禁用(这也有利于安全) 
  • 如无需要,禁用所有 quickcontrols2 样式。不仅不要构建它们,更重要的是不要导入它们

  • 禁用更多图像格式--例如,SVG支持在二进制大小拆解中是非常显著的 
  • 如果不需要,则禁用设置--设置在二进制大小拆解中也非常明显

还有更多。许多功能(如shortcuts支持)仍保留在最小配置中,这是因为参考应用程序使用了这些功能,但也许您的应用程序并不需要它们。

我禁用了一个功能, 现在Qt无法编译了

文中所示的这些配置,为了成功编译,需要做一些小的代码修复。这是可以理解的,因为编译所有可能的功能组合并不现实(理论上,这些组合比可见宇宙中的原子数还多)。

幸运的是,这些修复通常都很小且简单。 如果您配置了非标准的功能集,并遇到本应可用的功能出错时,请在 Qt Bug Tracker 上提交报告提交补丁

结论

功能选择和构建标志会极大地影响 Qt 库和应用程序的大小。越清楚了解应用程序的需求,就越能优化精简。这里介绍的最小化配置可以作为您自己精简配置的良好起点

不过,需要注意的是,体积最小化的应用程序并不适合开发阶段使用。 在开发阶段,应该保留必要的工具和调试符号。此外,使用链接时代码生成静态编译应用程序比共享编译要慢

Blog Topics

Comments

Subscribe to our blog

Try Qt 6.11 Now!

Download the latest release here: www.qt.io/download

Qt 6.11 is now available, with new features and improvements for application developers and device creators.

We're Hiring

Check out all our open positions here and follow us on Instagram to see what it's like to be #QtPeople.