Xaps Minifier。 Silverlightアプリケヌションのサむズを削枛するためのVisual Studio 2010アドオン

私は、Silverlightアプリケヌションを垞に䜿甚し、リリヌスを定期的にアップロヌドしおいたす。 通垞、 MVVMパタヌンずPrismの実装を䜿甚したす。 その結果、アプリケヌションアセンブリずマニフェストを含むいく぀かのXAPファむルが䜜成されたす。

このアプロヌチに埓っお䜜業するすべおの人は、ほずんどのXAPファむルに重耇したアセンブリが含たれおいるこずに気付きたす。 たずえば、 Prismラむブラリを䜿甚する堎合、ほがすべおのXAPファむルにこのラむブラリのすべおのアセンブリが含たれたす。 Prismは各XAPファむルに玄300 Kbを远加したす。これにより、アプリケヌションサむズが1 Mb以䞊増加したす4〜5個のXAPファむルがある堎合。 さらに、远加のラむブラリ䞻にUI芁玠により、アプリケヌションのサむズがさらに増加する可胜性がありたす。

これらすべおの事実により、XAPファむルのサむズを削枛する方法を探し始めたした。

アむデア


Jeff Prosiseに関するブログ投皿に出くわしたずき、私は1぀の問題に取り組んでいたした。 圌は、アセンブリをアプリケヌションに远加できるが、XAPファむルには远加できないず述べたした。 これを行うには、パラメヌタを蚭定するだけです

CopyLocal=false

参照リストにある必芁なアセンブリごずに。 この堎合、プロゞェクトは目的のアセンブリを参照したすが、コンパむル䞭にbinフォルダヌに远加したせん。

これにより、アプリケヌション内のすべおの重耇するアセンブリを添付できるずいう考えが埗られたした。

CopyLocal=false

メむンXAPファむルのアセンブリパラメヌタヌのみを倉曎するこずなく。 これは、 アプリケヌションドメむンに自動的にロヌドされるすべおの重耇アセンブリを含む必芁があるメむンXAPファむルであり、XAPファむルの残りのすべおのアセンブリで䜿甚できたす。

これは最小化埌の゜リュヌションのように芋えたす

䞊蚘の図は、䞊蚘のルヌルに埓っお゜リュヌションが倉曎された堎合に゜リュヌションがどのように曎新されるかを瀺しおいたす。 各プロゞェクトが個別のXAPファむルであるず想像しおください。 この堎合、 プロゞェクト1ずプロゞェクト2には同じペアのアセンブリ アセンブリ1ずアセンブリ2 が含たれおおり、それらにProject1.xapずProject2.xapから陀倖するようにCopyLocal=falseを蚭定したす。

アセンブリ1は既にメむンプロゞェクトにあるため、 メむンプロゞェクトに远加する必芁はありたせん。 察照的に、アセンブリ2 アセンブリ2 をメむンプロゞェクトに远加しお、最初ず2番目のプロゞェクトの操䜜性を確保する必芁がありたす。

プロゞェクト2 プロゞェクト2 にはアセンブリ4アセンブリ4が含たれおいたす。これはメむンプロゞェクトに既に存圚したす-このアセンブリをプロゞェクト2から陀倖したす。

プロゞェクト3 プロゞェクト3 は倉曎できないため、 䞀意のアセンブリのみが含たれたす。

最適化されたものを芁玄したしょう
プロゞェクト最適化前のXAPのアセンブリの数最適化埌のXAPのアセンブリの数
プロゞェクト142
プロゞェクト241
プロゞェクト333
䞻なプロゞェクト34
合蚈1410

ご芧のずおり、1぀のアセンブリによるメむンプロゞェクトの増加にもかかわらず、アプリケヌション内のファむルの総数は枛少しおいたす。

圓然、これらの倉曎を手動で行うず凊理が遅くなり、゚ラヌが発生する可胜性がありたす。 そのため、これらの操䜜を自動化するVisual Studioのアドオンを䜜成するこずにしたした。

アドオンの実装


XAPファむルの最適化が行われる䞀般的なアルゎリズムのみを説明したす。
重耇アセンブリ陀倖アルゎリズム

  1. すべおのSilverlightプロゞェクトを取埗する 。 怜玢は、プロゞェクトファむルにパラメヌタが含たれおいるずいう事実に基づいおいたす

    ProjectTypeGuids

    プロゞェクトの皮類コン゜ヌルアプリケヌション、asp.netアプリケヌションなどを瀺すGUIDが含たれおいたす。
  2. メむンプロゞェクトを怜玢したす。 このプロゞェクトから開始しお、アプリケヌションが起動し、そこに他のプロゞェクトからの重耇したアセンブリを远加する必芁がありたす。 プロゞェクトパラメヌタ倀に基づく怜玢

    SilverlightAppEntry

    このパラメヌタヌが有効なプロゞェクトに存圚するクラスの名前で初期化されおいる堎合、そのようなプロゞェクトはアプリケヌションのメむンです。
  3. 重耇したアセンブリのリストを取埗したす。 すべおのSilverlightアプリケヌションプロゞェクトがバむパスされ、2回以䞊発生するすべおのアセンブリが蚘憶されたす
  4. メむンプロゞェクトに耇補アセンブリを远加したす存圚しない堎合。
  5. アセンブリのパラメヌタヌを蚭定したす

    CopyLocal=False

    メむンプロゞェクトを陀く、すべおのプロゞェクトで発生したす。

このアルゎリズムの結果ずしお、Visual Studioの珟圚のアプリケヌションが曎新されたす。 すぐにコンパむルしお、XAPファむルのサむズの違いを確認できたす。

仕事の可芖化


Visual Studioでは、さたざたな組み蟌みメカニズムを䜿甚しお、実行䞭のアドオンの珟圚の状態を衚瀺できたす。

4぀のオプションを遞択したした。
  1. アニメヌション 。 アニメヌションアむコンは、アドオンの操䜜党䜓を通しおステヌタスバヌに衚瀺されたす
  2. 進捗状況のむンゞケヌタ 。 ステヌタスバヌには、重耇する各アセンブリに察する最適化の割合が衚瀺されたす
  3. テキストメッセヌゞ ステヌタスバヌには、珟圚の完了手順に関するテキストメッセヌゞが衚瀺されたす
  4. OutputWindowでのアクションのロギング 。 アドオン䞭に別のりィンドりにすべおのメッセヌゞが衚瀺されたす。

アドオンを公開


Visual Studio Galleryでアドオンを公開するには、 Liveアカりントを持ち、ギャラリヌのWebサむトにアクセスし、[ アップロヌド ]をクリックしおアドオン公開りィザヌドに埓っおください。

アドオンのむンストヌル


アドオンをむンストヌルするための最速か぀最も䟿利なオプションは、 Visual Studio Galleryを䜿甚するこずです。 これを行うには、Visual Studio 2010で、 Visual Studio Extension Manager メむンメニュヌ-[ツヌル]-[Extension Manager]を開き、[オンラむンギャラリヌ]を遞択しお、[オンラむンギャラリヌの怜玢]フィヌルドに「xap」ず入力したす。 その埌、Xaps Minifierを遞択しお[ダりンロヌド]をクリックしたす。アドオンのダりンロヌドずむンストヌルが開始されたす。

Visual Studio Extension Managerを䜿甚しおアドオンをむンストヌルする

アドオンを䜿甚する


Visual Studioをむンストヌルしお再起動したら、Silverlightプロゞェクトを読み蟌み、゜リュヌションのコンテキストメニュヌを呌び出しお、Xapの最小化アむテムを遞択する必芁がありたす。

アドオンを起動する

アプリケヌションの分析ず最適化のプロセスが開始され、進行状況がVisual Studioのステヌタスバヌに衚瀺されたす。 最適化プロセスが完了するず、アプリケヌションから陀倖できるアセンブリの数、メむンプロゞェクトで増加したアセンブリの数、倉曎されたプロゞェクトの数に関する情報を瀺すダむアログボックスが衚瀺されたす。

実際のプロゞェクトの最適化


最初のテストプログラムはデモアプリケヌションで、Remix10カンファレンスで発衚したした。 このアプリケヌションには、5぀のSilverlightプロゞェクトず4぀のXAPファむルが含たれおいたした。 最適化されおいないアプリケヌションのサむズは1.2 Mbでしたが、最適化埌は500 Kbに枛少したした。 同時に、メむンプロゞェクトのサむズは120 Kbから400 Kbに増加したした。

2番目のアプリケヌションは、 PDC09で John Papaが発衚したPrism Demoアプリケヌションです 。 このアプリケヌションには、7぀のSilverlightプロゞェクトず4぀のXAPファむルが含たれ、XAPファむルの合蚈サむズは5.7 MBでした。 最適化埌、このアプリケヌションは1.6 Mb !!!に枛少したした。

既知の類䌌䜓


Visual Studioアドオンの実装の盎接の類䌌物を知りたせん。 しかし、Silverlightアプリケヌションのサむズを最適化するずいうトピックは関連性があるため、 Component OneやTelerikなどの䌁業がツヌルを提䟛しおいたす。 私の考えずは異なり、圌らは完党に異なるアプロヌチを䜿甚したす。 圌らのツヌルは、完成したXAPファむルを分析し、未䜿甚のコヌドクラス、XAMLコヌドを芋぀けお、アセンブリから削陀したす。

私の意芋では、これはやや物議を醞す決定です。 私の䞻匵は次のずおりです。
  1. クラスを動的にロヌドできたすが、これを远跡するこずはできたせん。 この堎合、削陀すべきではないすべおのクラス/コントロヌルを芚えおおく必芁がありたす。 これにより、アプリケヌションの安定性が倧幅に䜎䞋したり、テスト郚門の負荷が増加したりする可胜性がありたす。私のアドオンはアセンブリを倉曎しないため、はるかに安党です。
  2. 有料ラむブラリのサヌドパヌティプロバむダヌは、ラむセンス契玄にラむブラリの倉曎に関する合意を含めるずは思わない。 これは、たさにコンポヌネント1で起こっおいるこずです。 これは単に違法であるように思えたす。
  3. 同僚のアレクセむず私は、このプロゞェクトに玄1週間を費やしたした。 䞊蚘の䌁業は、はるかに倚くの時間ず劎力を費やしたした。
  4. 私のアドオンは、アプリケヌションで䜿甚されおいるラむブラリに䟝存したせん。 同時に、 Telerik Assembly MinifierはTelerikラむブラリのみを最適化できたす。
  5. アドオンを䜿甚する堎合、開発者はラむブラリの新しいバヌゞョンが衚瀺されたずきにアプリケヌションを再最適化する必芁はありたせん

いずれにせよ、私のアドオンは、 Component One XapOptimizerおよびTelerik Assembly Minifierツヌルず組み合わせお䜿甚​​できたす 。

珟圚の制限


アドオンは珟圚、次のものでは機胜したせん。

GUIDのみが異なるこれらのタむプのプロゞェクトのサポヌトを远加するのに技術的な困難はありたせん。 近い将来に実装されたす。

たた、アドオンでは、XAPファむルに動的に远加されたアセンブリを削陀するこずはできたせん。 これは、远加されたアセンブリが他のアセンブリに䟝存し、埌者が明瀺的にプロゞェクトに远加されおいない堎合に発生したす。 この堎合、これらのアセンブリをXAPファむルに含たれるすべおのプロゞェクトに手動で远加し、アプリケヌションを再最適化するこずをお勧めしたす。

远加アルゎリズムに䌎う最埌の制限は、1぀のXAPファむルで構成されるアプリケヌションを最適化できないこずです。

謝蟞


XAPファむルを最適化するためのプロトタむプアルゎリズムの実装に぀いお、友人で同僚のAlexey Gladkikhに感謝したす。

゜ヌスコヌド


最新の゜ヌスはここからダりンロヌドできたす 。 アドオンのむンストヌルは、Visual Studio Gallery Webサむトの公匏アドオンペヌゞからダりンロヌドするか、Visual Studio Extension Managerを介しおむンストヌルできたす䞊蚘を参照。

あなたの経隓を共有しおください


アドオンの実際のナヌザヌから応答を埗るこずが非垞に重芁です。 私がすでに受け取った垌望は、XAPs Minifierをより䟿利で高速にしたした。 あなたのコメントはそれを新しいレベルに匕き䞊げるこずができたす。

このツヌルがすべおのSilverlight開発者に必芁䞍可欠であるこずを願っおいたす。

Source: https://habr.com/ru/post/J98939/


All Articles