読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Android アプリのパッケージサイズについて

Xamarin Xamarin.Android

Xamarin.Android で作成した apk パッケージサイズについて、エントリーを分けます。

以下、Application Package Sizes | Xamarin の参考訳です。

 

リリースパッケージ

Mono ランタイムなどを含む Xamarin のアプリはアプリケーションサイズが大きくなります。そのため、使用していない機能を削除したライブラリを組み込む機能があります。

完全なアプリケーションを出荷するために、パッケージにはアプリケーション、関連ライブラリ、コンテンツ、Mono ランタイム、および必要な基本クラスライブラリ(BCL)のアセンブリを含める必要があります。ここではデフォルトの "Hello World" のテンプレートでは、完全なパッケージのビルドの内容は、次のようになります。

http://docs.xamarin.com/guides/android/advanced_topics/application_package_sizes/Images/hello_world_package_size_before_linker.png

 

15.8 MB は、我々が望むよりも大きなダウンロードサイズです。問題は、アプリケーションを実行するのに必要なコンポーネントの多くを提供する mscorlib、system、Mono.Android などを含む BCL のライブラリです。しかし、これらはアプリケーションで使用していない機能を提供しているため、これらの構成要素を除外することができます。

私たちは配布用のアプリケーションをビルドするときにアプリケーションを検査し、直接使用されていない任意のコードを削除するリンクプロセスを実行します。このプロセスは、ガベージコレクションに似ています。オブジェクト上で動作する代わりにリンクがあなたのコードで動作します。例えば電子メールを送受信するためのSystem.dll 全体の名前空間がありますが、あなたのアプリケーションでこの機能を利用していない場合はコードだけのスペースを無駄にしています。Hello World アプリケーションでリンカを実行した後、パッケージには次のようになります。

http://docs.xamarin.com/guides/android/advanced_topics/application_package_sizes/Images/hello_world_package_size_after_linker.png

 

ここで分かるように、使用されていない BCL のかなりの量を削除します。最終的な BCL のサイズはアプリケーションが実際に使用するものに依存していることに注意してください。ApiDemo と呼ばれるより実質的なサンプルアプリケーションを見た場合、ApiDemo は Hello World よりも BCL の多くを使用しているため、BCLコンポーネントのサイズが増加していることがわかります。

http://docs.xamarin.com/guides/android/advanced_topics/application_package_sizes/Images/api_demo_package_size_after_linker.png

ここのようにアプリケーションのパッケージサイズは、一般的にアプリケーションとその依存関係により約 2.9 MB以上になります。

 

 

デバッグパッケージ

初回デバッグ時にデバッグ用の共有ランタイム、共有プラットフォームを丸っとコピーして、次回以降のデバッグ転送を凄く速くする FastDev という仕組みがあります。

f:id:ytabuchi:20140108184359p:plain

初めてデバイス上でデバッグを行う際に、共有ランタイムおよび共有プラットフォームと呼ばれる二つの大きなパッケージをコピーします。共有ランタイムには Mono ランタイムと BCL が含まれており、共有プラットフォームには、Android API レベル固有のアセンブリが含まれています。

f:id:ytabuchi:20131202105636p:plain

これらのコンポーネントのコピーはかなりの時間がかかりますが1度だけ行われ、デバッグモードで実行されている後続のアプリケーションがこれらを利用することができます。最後に、小さくて速い、実際のアプリケーションをコピーします。

f:id:ytabuchi:20131202105646p:plain