XamarinでRESTful APIを叩くアプリの配布バイナリサイズ感を調べた(WP 2MB、Android 10MB、iOS 40MB)

2015年3月9日月曜日

アプリ開発において、バイナリの配布サイズは悩ましい問題です。

日本のようにLTEが広く普及した国をターゲットとする場合には、Wi-Fi専用ダウンロードとならないサイズ(iOS: 100MB、Android: 50MB)へ収めれば良いケースが多いのであまり致命的な問題にはなりません。

しかし世界には、LTEはおろか3Gすら利用できない環境もまだまだ多いので、日本以外を主ターゲットとするアプリの開発においては依然として厄介な問題です。

先日、iOS/Android/Windows PhoneをターゲットとしたアプリをXamarin.Formsベースで書いてみました。せっかくなので、その際に得られたアプリ配布サイズに関する情報を書き残しておきます*1。



Xamarinでのアプリサイズ感覚を得る上で、Hello World系のプロジェクトをそのままビルドしたサイズを見てもあまり意味がありません。実際のユースケースに近いライブラリ群を取り込んだ状態でなければ、iOS向けfull-AOTビルドでのアプリサイズの想定が立たないためです。

今回は
RESTfulなJSON-APIから取得したデータをSQLiteでローカルへ保存しつつXamarin.Formsでビューの表示とUIインタラクションをおこなう
という、今どきにありがちでXamarinによるクロスプラットフォーム化の恩恵が大きそうなアプリを想定しました。

まず、結果サイズはこのようになりました。

環境サイズ備考
iOS 32-bit21.9MBipaファイル状態では7.2MB程度
iOS 32-bit/64-bit39.2MB-
Android10.5MBGoogle Play表示で10MB
Windows Phone1.5MBストア表示で2MB

ここで使ったライブラリは以下のとおりです。


アプリ内で明示的に利用しているのは
  • PortableRest(RESTfulなAPI通信用)
  • SQLite.Net(SQLiteの読み書き用)
  • Xamarin.Forms()
  • ptfluentapi-portable(アプリ固有の利用ライブラリ。PortableRestに依存)

です。これら以外のJson.NETとMicrosoft.BclはPortableRestの依存ライブラリです。
コード的には、ログイン画面→リスト画面→詳細画面 + 設定画面の4画面をXamarin.Formsで構築しました。SQLiteには設定情報のみを格納した状態で、RESTfulなAPIから取得したデータの格納はおこなっていません。

サイズは想像通りWindows Phone < Android << iOSという結果でした。とりわけ、2015/02/01以降、64-bitバイナリの添付が義務付けられたことでiOSのサイズが際立ちます。ストアへのサブミットに利用するipaファイルではアーカイブ内の全ファイルが単純にzip圧縮されるのに対し、iTunes Storeでの配布時には実行バイナリ部分が無圧縮へと変形される(XcodeのEstimate機能で表示される推定配布サイズはこっち)ため、Xamarinアプリ内で大半を占める部分がまるごと圧縮されないという歯がゆい状況ではあります。iOSでは構造上UPXのような仕組みが使えないのでどうしようもありませんね。可能な範囲でシンボルを削るとか、なにかしらのminify策が使えると良さそうですけれど。

ひとまず、最低限これぐらいのサイズ、後はpay as you goで膨らんでいくという感覚でいると、アプリ完成直前に「うわああぁぁぁ」とならずに済むでしょう。

*1: このアプリはXamarin.Forms Portableアプリとして作りました。Xamarin.Forms Sharedアプリとして組むと、ある程度は努力によってバイナリサイズを抑えられる可能性がありますが、ここでは検討しません

0 件のコメント:

コメントを投稿