我使用Delphi 2009为桌面程序发布了一个可执行文件(.EXE)。我没有外部DLL或运行该程序所需的资源。
我使用两个组件:LMD Innovative的ELPack和Sergey Tkachenko的TRichView,它们已编译到我的可执行文件中。
当我使用“发布”构建配置来构建生产版本时,生成的可执行文件为13,533 KB。
在使用Delphi 2009之前,我使用的是Delphi4。它生成的可执行文件只有2,671 KB,同时包含相同的两个组件,并且基本上具有与当前版本相同的代码。
我确实知道Delphi 2009完全是Unicode(这是我升级的主要原因),而成为Unicode可能导致大小加倍。但这大约是它的5倍。
为什么我的可执行文件必须保持5倍大?还是有一些简单的方法可以减少可执行文件的大小?
请注意。有人在回答压缩Delphi EXE的方法。那不是我想做的。我想简单地了解为什么要使用这么多空间来删除可能不必要的内容。如果这样做,则压缩仍可以在以后进行。
安装可执行文件后,它的大小实际上并不重要。它用于下载目的,并最大程度地减少要压缩它的服务器负载和下载时间。我更喜欢使用Inno Setup并在安装例程本身内部压缩程序。然后在安装后将其扩展为完整尺寸。这既防止了可能的病毒检测,又消除了解压缩内存中程序所需的额外启动时间。另外,我对可执行文件和安装例程都进行了代码签名,并且某些压缩技术与此不兼容。
有关压缩的更多信息,请参见StackOverflow问题: Delphi EXE压缩器?
ldsandon要求我确切提供我正在使用的选项,所以这里是:
(来源:beholdgenealogy.com)
(来源:beholdgenealogy.com)
当从Delphi 7迁移到Delphi 2010.时,我们的.exe文件从16兆增长到35兆。
几周前,我在Embarcadero论坛上提出了一个与你类似的问题。(链接)在我的OP中,我列出了与此主题相关的一系列链接,这些链接可能会有所帮助。
我们尝试使用UPX压缩我们的.exe文件。让它工作几个小时会大大减少我们的.exe,但由于以下原因,我们可能不会在生产中使用它:
我们有很多.exe,并且不想在每个版本上等待1/2天。(有可能我们可以找到UPX的一组非蛮力参数来减少这种情况...)
尽管.exe的大小减小了,但我们的可交付项却没有,因为我们的安装程序(不足为奇)无法从已经压缩的文件中挤出更多的压缩...而它却能够将原来的16 meg .exe压缩下来到8兆。
我读过一些报告,说(有时,但并非从来没有),UPX exe触发了各种防病毒程序,以报告该应用程序包含病毒。(我不记得看到它的日期,地点或详细信息,所以我在这里报告它有点不公平。)但是,我们非常反对冒这种可能性发生的风险,以至于UPX不在桌子上...
Embarcadero论坛上的链接还包括指向该主题的另一个SO线程的链接。
对于在移至Delphi 2010时发现的代码膨胀,我仍然感到惊讶和失望。正如Nick所指出的,Unicode的2X实在是太过分了。
但是,在迁移到D2010时,膨胀只是一个相对较小的折衷,因为IMO在其他许多方面都对D2010进行了如此出色的升级。但是,这确实意味着我们可能不得不转移2张CD而不是一张CD。我不希望看到我们组织对此的 React ...
@ Tom1952:您不能压缩两次。因此,最好使用安装程序进行压缩以减小下载大小。我使用InnoSetup,它将我的13.5 MB程序包含在只有4.5 MB的安装程序包中。运行安装程序时,它将程序压缩为完整大小,因此不会出现任何病毒检测问题。
@ Tom1952:感谢您在Embarcadero论坛上与您类似问题的链接。这是一个非常有趣的讨论(包括Peter Under的一些评论)。您提到的一点是关于大图标的。好吧,我确实在程序中添加了一些大的Vista图标,这可能会增加MB大小。也许您编写的程序可能对我有帮助。
@ Tom1952:我还没有看到其他的问题。这是一个很好的主意,并带有一些有用的实用程序的链接。
由于D2010扩展了RTTI的功能,因此D2010是另一回事,我可以想象对它的错误管理(在任何地方都打开它)可能会使exe膨胀。OP在谈论D2009。
当然,UPX触发假阳性是一种风险。但是您也可以通过设置,任何库或使用任何特定的开发环境(Delphi,VS等)来获得相同的结果。因此,尽管您无法消除风险,但是跳过UPX减少风险因素的数量是合理的。