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を適用して効果を確認してみましょう。
XapOptimizerを起動したら「新規プロジェクトの作成」を選択し、XAPファイルを指定します。正常にファイルが読み込まれると自動的に使用しているコンポーネントの内容が解析されます。
デフォルトの状態では最適化後のファイルの出力先は同一ファイルになります。そこで、オプションを指定して自動的にバックアップを取るように設定変更を行います。
この指定を行えば、XAPファイルの存在するフォルダにbackupフォルダを作成し、最適化前のXAPファイルをbackupフォルダにコピーしてから上書きが行われます。
除去内容の確認
最適化時にどのような部分が除去されるかは[除去]タブで確認できます。
除去される部分は灰色、除去されない部分(例えば、C1ContextMenu)は黒色で表示されています。除去判定された部分についても、名称の左にあるピンをクリックしてピン指定すれば、強制的に黒色に(除去されないように設定)できます。
リフレクションなどが使われているときは、うまく解析ができずに必要な部分も除去判定されてしまう可能性があるのですが、まずは自動判定のままの状態で実行してみましょう。
最適化の実施
[最適化]ボタンをクリックすると、XAPファイルの最適化によりどれくらいサイズが変わったかが表示されます。
今回のサンプルでは、最適化前に126KBあったXAPファイルのサイズが最適化後は55KBにまで小さくなっています。これだけでストレージの使用率が50%削減できました。
最適化後の実行
では、最適化してもきちんと実行できるのかどうか試してみましょう。
最適化したXAPファイルをVisual Studioを使って配置しようとすると再コンパイルが走る場合があるので、Windows Phone SDKのApplication Deploymentを使って配置を行います。まずは、Windows Phone Emulatorに配置してみましょう。
配置が正常に完了すればWindows Phone Emulatorのアプリケーションリストに「CZ1203ContextMenu」アイコンが表示されるので、そのアイコンをタップして実行します。
結果は、「C1ContextMenuServiceが存在しない」という実行時エラーが発生してしまい、正常に動作しませんでした。これはサンプルを実行するのに必要な要素が除去されていることを意味します。
除去の制御
もう一度、[除去]タブの内容を確認してみましょう。C1ContextMenuをクリックすると依存関係に「C1ContextMenuService」が灰色で表示されています。
このC1ContextMenuServiceの名称の左側にあるピンをクリックしてピン設定を行い、除去されないようにします。その後、backupフォルダにある最適化前のXAPファイルをコピーして、再度最適化をしてみましょう。
C1ContextMenuServiceはあまり大きなクラスではなかったためか、ピン設定して除去を行わないようにしてから最適化した場合も最適化後のサイズは55KBと同様な効果を得ることができました。
できあがったXAPファイルを再びWindows Phone Emulatorに配置して、先ほどと同じように実行します。今度は実行時エラーもなく意図した動作を行ってくれます。
除去設定の保存
デフォルトの除去状態ではなくピン設定などを行った場合、XapOptimizerの設定を保存しておき次回以降も同じピン設定を復元して最適化すると便利です。
このような場合、[名前を付けて保存]を使ってXapOptimizer Project File(xoprojファイル)に前回の内容を保存します。
XapOptimizer適用前後の比較
XapOptimaizorで最適化した場合、XAPファイルのサイズが小さくなります。この恩恵はmarketplaceからのダウンロード時間が短縮できたり、ストレージ容量の使用率が削減できたりすることだけではありません。
XAPファイルは拡張子をzipからxapに変更したものです。そのため、XAPファイルの拡張子をzipに変更すればWindowsのファイルエクスプローラで内容を見ることができます。
上図にあるように、今回の最適化ではC1.Phone.dllのサイズが大幅に縮小されています。これはC1.Phone.dllの未使用部分を除去したことを意味します。
zip圧縮を解除した状態でサイズを考えると、342KBが77KBに縮小されたと評価できます。Windows PhoneアプリはインストールこそXAPファイルですが、実際の動作はzip圧縮を解除した状態でメモリ上にローディングされます。メモリ使用効率から言えば実に5倍も効率よくメモリが使えるということになります。
ビルドプロセスにXapOptimizerを組み込む
最適化を行う際、Visual Studioでビルドし、XapOptimizerで最適化、Application Deploymentで配置して…という一連の作業を毎回行うのはだんだんと面倒になってきます。
そこで、Visual Studioの機能を使ってビルドイベントの中にXapOptimizerの最適化を組み込んでしまいましょう。
ビルドが成功したときのビルドイベントでXapOptimizerを起動するには、次の手順で設定が必要です。
- プロジェクトのプロパティで[コンパイル]タブを選択
- [ビルド]ボタンをクリック
- [ビルド後の編集]ボタンをクリック
- ビルド後に実行するコマンドラインを設定
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を閉じると自動的に配置が行われます。
しかし、この方法で起動したXapOptimizerはデフォルト設定のため、除去対象からはずすピン設定などを保存しておくことはできません。
xoprojを活用した組み込み例
ビルドイベントの中で呼び出したXapOptimizerでピン設定を毎回手動で実施するのは、作業ミスなどが起こりやすくなり、非効率です。そこでピン設定をxoprojファイルに保存しておき、その保存値を自動適用するように変更してみましょう。
まずは前段階として、設定値を保存します。
- XapOptimizerを起動する
- XAPファイルを指定する
- ピン設定を行う
- バックアップを取得するように設定する
- 名前を付けて設定を保存する(aaa.xapならaaa.xoprojとしてプロジェクトファイルと同じ場所に保存する)
次にビルドイベントのビルド後に実行するコマンドラインを設定します。
"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へ発行されて、アプリが起動します。
まとめ
最後に、もう少し実用的なWindows Phoneアプリを最適化した結果を確認してみましょう。
アプリケーション名 | 最適化前 | 最適化後 |
CZ1203ContextMenu | 127KB | 56KB |
CZ1205FourSquareVB | 226KB | 146KB |
CZ1205Metro4sqVB | 596KB | 516KB |
CZ1206ImageVB | 204KB | 110KB |
必要なピン設定を行い、正常に動作する設定を確認できたら、xoprojとして保存して測定した結果となります。最適化により小さくなる割合はWindows Phoneアプリによってまちまちです。これは除去できるライブラリが異なるという要因が大きいでしょう。しかし、効果はありますし、表にもあるように最大で50%近い削減は、Windows Phoneのリソースに良い影響を与えるでしょう。