22


6

実行可能ファイルのサイズを縮小するにはどうすればよいですか(Delphi)

Delphi 2009を使用して、デスクトッププログラム用の単一の実行可能ファイル(.EXE)をリリースします。 プログラムを実行するために必要な外部DLLやリソースはありません。

私は2つのコンポーネントを使用します:http://www.lmdinnovative.com/products/lmdelpack/[LMD Innovative’s ELPack]およびhttp://www.trichview.com/[Sergey Tkachenko’s TRichView]は実行可能ファイルにコンパイルされます。

「リリース」ビルド構成を使用して製品バージョンをビルドすると、生成される実行可能ファイルは13,533 KBです。

Delphi 2009を使用する前は、Delphi 4を使用していました。 生成された実行可能ファイルは2,671 KBでしたが、同じ2つのコンポーネントを組み込み、基本的に現在のバージョンと同じコードを持っています。

Delphi 2009は完全にUnicodeであり(これがアップグレードした主な理由です)、Unicodeになると最大で2倍のサイズになることを理解しています。 しかし、これは約5倍です。

実行可能ファイルを5倍大きくしなければならない理由はありますか? または、実行可能ファイルのサイズを大幅に削減する簡単な方法はありますか?

'' '' '

ご注意ください。 一部の人々はDelphi EXEを圧縮する方法で答えています。 それは私がやろうとしていることではありません。 必要のないものを削除するために、なぜそんなに多くのスペースが使用されているのかを単純に確認しようとしています。 それが行われた場合、必要に応じて圧縮を後で行うことができます。

実行可能ファイルがインストールされた後、それがどれだけ大きいか小さいかは本当に関係ありません。 これは、ダウンロードを目的としており、サーバーの負荷とダウンロード時間を最小限に抑えて圧縮することを目的としています。 私はhttp://www.jrsoftware.org/isinfo.php[Inno Setup]を使用し、インストールルーチン内でプログラムを圧縮することを好みます。 それがインストールされると、フルサイズに拡張されます。 これは、ウイルスとして検出される可能性を防ぎ、メモリ内のプログラムを解凍するために必要な余分な起動時間を排除します。 また、実行可能ファイルとインストールルーチンの両方にコード署名しますが、一部の圧縮技術はそれと互換性がありません。

圧縮の詳細については、StackOverflowの質問をご覧ください:https://stackoverflow.com/questions/800505/delphi-exe-compressor/800553[Delphi EXEコンプレッサー?]

'' '' '

ldsandonは、私が使用しているオプションを正確に提供するように私に求めたので、ここにあります:

http://www.beholdgenealogy.com/img/compilingoptions.jpg [コンパイルオプションhttp://www.beholdgenealogy.com/img/compilingoptions.jpg]

http://www.beholdgenealogy.com/img/linkingoptions.jpg [リンクオプションhttp://www.beholdgenealogy.com/img/linkingoptions.jpg]

15 Answer


14


Delphi 7からDelphi 2010に移行すると、たとえば.exeは16メガから35メガに増加しました。

数週間前に、Embarcaderoフォーラムであなたに似た質問をしました。 (https://forums.embarcadero.com/message.jspa?messageID=250163#250163[link])私のOPには、この主題に関する一連のリンクがリストされています。

UPXを使用して.exeを圧縮してみました。 数時間動作させると、.exeが大幅に削減されましたが、次の理由で運用環境では使用しないでしょう。

  1. かなりの数の.exeがあり、それぞれに1日半待ちたくない 構築します。 (これを軽減するUPXへの非強引なパラメータのセットを見つけることができる可能性があります…​)

  2. .exeのサイズは縮小されますが、_shippable_は縮小されませんでしたが、 インストーラーは(当然のことですが)既に圧縮されたファイルからさらに多くの圧縮を圧縮できないためです…​ 一方、元の16 MBの.exeを8 MBに減らすことができました。

  3. 私はいくつかのレポートを読んだことがありますが、いつか(まれではありますが、決してではない)UPX exeはさまざまなウイルス対策プログラムを起動して、アプリケーションにウイルスが含まれていることを報告しました。 (日付、サイト、またはこれを見た場所の詳細を思い出せないので、ここで報告するのは少し不公平です。)しかし、そのような可能性が発生するリスクを冒すことに非常に不利です、UPXテーブルから外れています…​

Embarcaderoフォーラムのリンクには、このトピックの別のSOスレッドへのhttps://stackoverflow.com/questions/2150025/how-to-achieve-smaller-size-of-the-executable[link]も含まれています。

Delphi 2010に移行したときに見つかったコードの肥大化には、引き続き驚きと失望を感じています。 Nickが指摘しているように、Unicodeの2Xは非常に過剰です。

ただし、IMO、D2010は他の多くの点で非常に素晴らしいアップグレードであるため、D2010に移行するときの肥大化は比較的軽微なトレードオフです。 しかし、_does_は、おそらく1枚ではなく2枚のCDを出荷する必要があることを意味します。 私たちの組織からこれに対する反応を見ることを楽しみにしていません…​


10


「リリース」ビルド構成が使用する実際の設定を確認せずに、このサイズの増加を説明するには、多くの推測が必要です。

使用されなくても「ドラッグ」されるコードの量が大幅に増加する可能性のあるいくつかの考えられない要因を超えて、その増加の大きさはデバッグ情報を含めることで最も簡単に説明できます。

私はあなたのコンパイラとリンカの設定をチェックします:

  • デバッグ情報(コンパイラー設定)

  • TD32情報(リンカー)

  • リモートデバッグ情報(リンカー)

Delphi 2009プロジェクトのこれらの設定を、Delphi 4の同等の設定と比較します。


7


予想されるUnicodeからの2倍の増加を考慮に入れると、2.5倍の増加になります。 これは、スキップしたバージョンの数を考慮すると理にかなっています。 Delphi 4以降、VCLとRTLに多くの機能が追加されており、使用しなくてもすべてが簡単にスマートリンクできるものではありません。 使用しているユニットの数に応じて、かなりの余分な荷物を運ぶことができます。

アレンバウアーとコンパイラチームは、http://blogs.embarcadero.com/abauer/2009/09/03/38898 [これを減らすためにD2010に追加された新機能]を追加しましたが、どうやら慎重に踏み込んで使用していなかったようですできる限り多くの場所で 2011年以降のリリースで、より多くのゴ​​ミが削減されることを願っています。


7


いくつかの単語を追加します。 リンカは、コード階層に従うことができる場合にのみ、未使用のプロシージャと関数を削除できます。 以下にリストされているリンカーの悪夢のリスト:

  • メッセージ駆動型コード、悲しいニュースは、このコードを削除できないことです いずれにせよ、Delphiの空白プロジェクトのサイズがバージョンからバージョンへと拡大し続ける理由です。 新しいウィンドウメッセージ(WM_TOUCHなど、最近紹介したものであれば)はすべて、削除できないプロシージャ呼び出し階層を作成します(Touch APIをまったく使用する予定がない場合でも)。 これは、すべての* case WM _: *フラグメントが、リンカーが使用するかどうかを決定できないものだからです。

  • 開始、終了、初期化からアクセスされるコードおよびデータ構造 ユニットの最終セクション。 ここで、いくつかの制御を行い、不要な呼び出しやオブジェクト作成を削除します。 オブジェクトをオンデマンドで作成し、ファイナライズセクションでのみ解放する場合でも、慎重に作成してください


5


「upx-実行可能ファイルの圧縮または展開」@ http://upx.sourceforge.netを使用します

'' '' '

tools / configure toolsに移動してこのように設定すると、IDEのメニュー項目を使用して、作業中の実行可能ファイルを簡単に圧縮できます。

画像:https://www.xs4all.nl/~niff/stuff/UPX.png [設定]


4


別の方法は、「どのユニットがサイズを大きくするか」に注目することです。

これを行うには、JCL / JVCLインストールでIDEに統合されたJCL「Project Analyzer IDE」を使用します。すべてのユニットがそれぞれのサイズで表示されます。 テキストファイルでエクスポートできます。 2つの環境(D4およびD2009)でそれを行うと、多くの関連情報が得られます。


4


D2010にアップグレードするため、D2007とD2010の違いを確認するためにいくつかのテストを行いました。 約60のフォーム(詳細フォーム、フレームなどのグリッド)を備えた中規模の管理GUIアプリケーションをテストしました。 TMSコンポーネント+ Remobjectsを使用しています。

D2007:+「通常の」コンパイル:18.8mb +デバッグdcuの場合:18.8mb(同じサイズ!)

D2010 +通常:23.9 +デバッグdcu:48.8mb(!)

デバッグdcuを使用すると、exeサイズが2倍になります…​

ビジネスサービスでテスト(大きなdfmなし):+ D2007:12.3mb + D2010:17.1mb

はい、D2010はexeを(少し)増やしますが、これは私の顧客にとって問題ではありません。

編集:コンパイルされたサイズに関する情報:+ D2007:+ image:https://lh4.ggpht.com/_E-a18Co_H4A/TDrCI9Bi4-I/AAAAAAAABR8/XM6shZhAF2U/Service2007.png [alt text] + D2010:+ image:https ://lh4.ggpht.com/_E-a18Co_H4A/TDrCJFINWRI/AAAAAAAABSA/Tb5o5g37_tM/Service2010.png [alt text]

したがって、コードサイズは増加しますが、データは2倍以上になります。


3


dfm-sの形式を確認してください。 exeを小さくしたい場合は、バイナリ形式である必要があります。


2


exeコンプレッサーを使用したくない場合は、http://www.jrsoftware.org/striprlc.php [StripReloc]を試してください。


2


1)詳細なマップファイルを生成しています。「used debug dcus」を設定しているため、RTL / VCLユニットのシンボルも含まれます。 コールスタックなどを生成するために例外処理システムで使用される場合、実行可能ファイルに追加できます。 そして、なんらかの方法で圧縮しないと、.exeサイズがかなり大きくなる可能性があります。

2)debug dcusを使用すると、通常、最適化およびデバッグオプションセットなしでコンパイルされ、コードも遅くなるため、.exeが多少大きくなります。 リリースバージョンでは使用しないでください。

3)デバッグ情報は、マップファイルの生成にIIRCが必要ですが、debig情報をユニットにのみ追加し、実行可能ファイルには追加しないでください。