CodeZine(コードジン)

特集ページ一覧

XapOptimizerでWindows Phoneアプリの使用リソースを最適化しよう

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/08/21 14:00

 今回は、Silverlightアプリケーションのファイルサイズを最適化するソフトウェア「XapOptimizer 1.0J」を使って、過去のサンプルファイルを最適化し、その効果を検証していきます。

XapOptimizerとは

 XapOptimizer 1.0J(以下、XapOptimizer)はSilverlightアプリケーションのファイルサイズを最適化するソフトウェアです。XAPファイルに含まれるアセンブリを自動解析し、使われていないクラスやXAMLリソースを削除することにより、XAPファイルを最大70%削減します。

 このソフトウェアを使うと、アプリの持つ機能はまったく削ることなく、アプリの起動時間を短縮し、起動中に使用するリソースを減らすことが可能です。

 XapOptimizerが発売された当初のバージョンでは、Windows Phoneアプリには未対応でした。しかし2012年3月2日にリリースされたSP1を適用することで、Windows Phone 7.5アプリにも対応可能となりました。今回は、このSP1を使って、本当に機能に影響なくリソースが自動削除できるのか、また、リソースを削減することでどれくらい効果があるのかを、過去のサンプルプログラムに対してXapOptimizerを適用しながら確認していきます。

手動によるXapOptimizer適用

 まずは、既に作成されているXAPファイルに対して、XapOptimizerを適用して効果を確認してみましょう。

図1 手動によるXapOptimizer適用
図1 手動によるXapOptimizer適用

 XapOptimizerを起動したら「新規プロジェクトの作成」を選択し、XAPファイルを指定します。正常にファイルが読み込まれると自動的に使用しているコンポーネントの内容が解析されます。

図2 出力ファイルの指定
図2 出力ファイルの指定

 デフォルトの状態では最適化後のファイルの出力先は同一ファイルになります。そこで、オプションを指定して自動的にバックアップを取るように設定変更を行います。

図3 自動バックアップの指定
図3 自動バックアップの指定

 この指定を行えば、XAPファイルの存在するフォルダにbackupフォルダを作成し、最適化前のXAPファイルをbackupフォルダにコピーしてから上書きが行われます。

除去内容の確認

 最適化時にどのような部分が除去されるかは[除去]タブで確認できます。

図4 除去内容の確認
図4 除去内容の確認

 除去される部分は灰色、除去されない部分(例えば、C1ContextMenu)は黒色で表示されています。除去判定された部分についても、名称の左にあるピンをクリックしてピン指定すれば、強制的に黒色に(除去されないように設定)できます。

 リフレクションなどが使われているときは、うまく解析ができずに必要な部分も除去判定されてしまう可能性があるのですが、まずは自動判定のままの状態で実行してみましょう。

最適化の実施

 [最適化]ボタンをクリックすると、XAPファイルの最適化によりどれくらいサイズが変わったかが表示されます。

図5 最適化の効果確認
図5 最適化の効果確認

 今回のサンプルでは、最適化前に126KBあったXAPファイルのサイズが最適化後は55KBにまで小さくなっています。これだけでストレージの使用率が50%削減できました。

最適化後の実行

 では、最適化してもきちんと実行できるのかどうか試してみましょう。

 最適化したXAPファイルをVisual Studioを使って配置しようとすると再コンパイルが走る場合があるので、Windows Phone SDKのApplication Deploymentを使って配置を行います。まずは、Windows Phone Emulatorに配置してみましょう。

図6 最適化したXAPファイルの配置
図6 最適化したXAPファイルの配置

 配置が正常に完了すればWindows Phone Emulatorのアプリケーションリストに「CZ1203ContextMenu」アイコンが表示されるので、そのアイコンをタップして実行します。

図7 最適化したXAPファイルの実行
図7 最適化したXAPファイルの実行

 結果は、「C1ContextMenuServiceが存在しない」という実行時エラーが発生してしまい、正常に動作しませんでした。これはサンプルを実行するのに必要な要素が除去されていることを意味します。

除去の制御

 もう一度、[除去]タブの内容を確認してみましょう。C1ContextMenuをクリックすると依存関係に「C1ContextMenuService」が灰色で表示されています。

図8 除去から除外
図8 除去から除外

 このC1ContextMenuServiceの名称の左側にあるピンをクリックしてピン設定を行い、除去されないようにします。その後、backupフォルダにある最適化前のXAPファイルをコピーして、再度最適化をしてみましょう。

図9 最適化の再実行
図9 最適化の再実行

 C1ContextMenuServiceはあまり大きなクラスではなかったためか、ピン設定して除去を行わないようにしてから最適化した場合も最適化後のサイズは55KBと同様な効果を得ることができました。

 できあがったXAPファイルを再びWindows Phone Emulatorに配置して、先ほどと同じように実行します。今度は実行時エラーもなく意図した動作を行ってくれます。

図10 最適化したXAPファイルの再実行
図10 最適化したXAPファイルの再実行

除去設定の保存

 デフォルトの除去状態ではなくピン設定などを行った場合、XapOptimizerの設定を保存しておき次回以降も同じピン設定を復元して最適化すると便利です。

 このような場合、[名前を付けて保存]を使ってXapOptimizer Project File(xoprojファイル)に前回の内容を保存します。

図11 xoprojファイルの保存
図11 xoprojファイルの保存

XapOptimizer適用前後の比較

 XapOptimaizorで最適化した場合、XAPファイルのサイズが小さくなります。この恩恵はmarketplaceからのダウンロード時間が短縮できたり、ストレージ容量の使用率が削減できたりすることだけではありません。

 XAPファイルは拡張子をzipからxapに変更したものです。そのため、XAPファイルの拡張子をzipに変更すればWindowsのファイルエクスプローラで内容を見ることができます。

図12 最適化前後でのXAPファイルの内容
図12 最適化前後でのXAPファイルの内容

 上図にあるように、今回の最適化ではC1.Phone.dllのサイズが大幅に縮小されています。これはC1.Phone.dllの未使用部分を除去したことを意味します。

 zip圧縮を解除した状態でサイズを考えると、342KBが77KBに縮小されたと評価できます。Windows PhoneアプリはインストールこそXAPファイルですが、実際の動作はzip圧縮を解除した状態でメモリ上にローディングされます。メモリ使用効率から言えば実に5倍も効率よくメモリが使えるということになります。

ビルドプロセスにXapOptimizerを組み込む

 最適化を行う際、Visual Studioでビルドし、XapOptimizerで最適化、Application Deploymentで配置して…という一連の作業を毎回行うのはだんだんと面倒になってきます。

 そこで、Visual Studioの機能を使ってビルドイベントの中にXapOptimizerの最適化を組み込んでしまいましょう。

図13 ビルドイベントでXapOptimizerを起動
図13 ビルドイベントでXapOptimizerを起動

 ビルドが成功したときのビルドイベントでXapOptimizerを起動するには、次の手順で設定が必要です。

  1. プロジェクトのプロパティで[コンパイル]タブを選択
  2. [ビルド]ボタンをクリック
  3. [ビルド後の編集]ボタンをクリック
  4. ビルド後に実行するコマンドラインを設定
リスト1 ビルド後に実行するコマンドライン
mkdir $(TargetDir)backup
COPY /y $(TargetDir)$(TargetName).xap $(TargetDir)backup
"C:\Program Files (x86)\GrapeCity\XapOptimizer1\bin\XapOptimizer.exe"
/i:$(TargetDir)$(TargetName).xap /o:$(TargetDir)$(TargetName).xap

 backup用フォルダを作成してからcopyコマンドでビルド直後のXAPファイルをコピーし、XapOptimizerを起動します。このとき/iパラメタには入力ファイル名、/oパラメタには出力ファイル名を指定します。

 設定が終わりビルドをすれば、完了後にXapOptimizerが自動起動されます。この時点でXapOptimizerでの最適化が終わっているため、XapOptimizerを閉じると自動的に配置が行われます。

図14 ビルドイベントでXapOptimizerを起動
図14 ビルドイベントでXapOptimizerを起動

 しかし、この方法で起動したXapOptimizerはデフォルト設定のため、除去対象からはずすピン設定などを保存しておくことはできません。

xoprojを活用した組み込み例

 ビルドイベントの中で呼び出したXapOptimizerでピン設定を毎回手動で実施するのは、作業ミスなどが起こりやすくなり、非効率です。そこでピン設定をxoprojファイルに保存しておき、その保存値を自動適用するように変更してみましょう。

 まずは前段階として、設定値を保存します。

  1. XapOptimizerを起動する
  2. XAPファイルを指定する
  3. ピン設定を行う
  4. バックアップを取得するように設定する
  5. 名前を付けて設定を保存する(aaa.xapならaaa.xoprojとしてプロジェクトファイルと同じ場所に保存する)

 次にビルドイベントのビルド後に実行するコマンドラインを設定します。

リスト2 ビルド後に実行するコマンドライン
"C:\Program Files (x86)\GrapeCity\XapOptimizer1\bin\XapOptimizer.exe"  /p:
$(ProjectDir)$(ProjectName).xoproj /cmd

 今回のコマンドラインでは、/pパラメタでxoprojファイルを指定しています。入力XAPファイルや出力XAPファイルはxoprojの中で定義されているもののみが有効なため、/iパラメタや/oパラメタを同時に指定することはできません。

 /cmdオプションは/pオプション指定時だけ設定できるパラメタで、/cmdオプションを指定するとXapOptimizerの画面を表示せずに最適化を実施します。

 ビルドイベントの設定が終わったら、Visual StudioでターゲットをWindows Phone Emulatorにして実行してみてください。ビルドが行われ、最適化された状態でWindows Phone Emulatorへ発行されて、アプリが起動します。

図15 アプリの実行
図15 アプリの実行

まとめ

 最後に、もう少し実用的なWindows Phoneアプリを最適化した結果を確認してみましょう。

表1 最適化の効果
アプリケーション名 最適化前 最適化後
CZ1203ContextMenu 127KB 56KB
CZ1205FourSquareVB 226KB 146KB
CZ1205Metro4sqVB 596KB 516KB
CZ1206ImageVB 204KB 110KB

 必要なピン設定を行い、正常に動作する設定を確認できたら、xoprojとして保存して測定した結果となります。最適化により小さくなる割合はWindows Phoneアプリによってまちまちです。これは除去できるライブラリが異なるという要因が大きいでしょう。しかし、効果はありますし、表にもあるように最大で50%近い削減は、Windows Phoneのリソースに良い影響を与えるでしょう。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 初音玲(ハツネアキラ)

     国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。  個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。  Microsoft MVP for Windows Development...

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5