Xamarin.Forms で簡単なアプリを作って、その Android 版を社内向けに配布しようとしたんですけど、 .apk のサイズが 60Mbyte超 もあって、「仕方ないよね…」と思いながら、 モバイル回線でそれをダウンロードさせるのかー、と思うと良心の呵責を感じてしまい、可能な限りで apk のサイズを縮小することを試みました。

Xamarin.Android アプリのビルドオプションを調整して apk サイズを減らす

apk サイズの削減については、

を参考にさせていただきました。当該記事は「起動時間」にフィーチャーしていますが、サイズ縮小についても十分に有用です。

最終的に落ち着いたコンパイルオプションは、

  • Android Build - Enable AOT
  • Linker - Link SDK assemblies only

で、これも上記記事と同じです(LLVM は使ってません)。
この結果 apk のサイズは 60Mbyte超 → 33Mbyte になりました。

(上記に比べてさらに、「Linker - Link all assemblies」 とすれば 25Mbyte にまで削減できましたが、このアプリは起動せず、「リンクしたらマズそうなアセンブリ」を Ignore assemblies に追加していったら起動するようにはなったものの apk は 29Mbyte になったので、かけるコストに対して効果は薄そうだと判断してやめました。)

ここまではアプリのビルドの話で、次からが本題です。

Azure Pipelines で Xamarin.Forms(Android) アプリをビルドする

Azure Pipelines は Azure DevOps というサービスに含まれるサブサービスの一つで、CI/CD の機能を提供します。

Android, iOS, Linux, macOS, Windows 用のアプリをビルド・デプロイできます。
OSS向けならビルド時間は無制限、個人プライベート向けでも1800分/月1 まで無料で使うことができます。

Azure Pipelines で Xamarin.Android 向けのプリセットを選択すると、ほぼそのままアプリのビルドが行える状態になります。このプリセットで使用されるビルドエージェントは “Hosted VS2017” で、つまり 「Visual Studio 2017 がインストールされた Windows マシン」 です。

が、上記の 「Enable AOT」 を有効にしたプロジェクトで CI ビルドさせると、以下のエラーが出ます。

XA5101: Missing Android NDK toolchains directory ‘\toolchains’. Please install the Android NDK.

どうやら Android NDK がインストールされていない様子。 Agent の Pool information を見ても Android NDK は記載されていません。

そこで 公式Twitter に凸! すると、

「Android NDK は Visual Studio が入れちゃんだわ、NDK は C:\Microsoft\AndroidNDK64\android-ndk-r15c に入ってるよ(超意訳)。」とのこと。
これを手がかりにさらに調べると、

in the MSBuild Options, provide the following Additional Argument:

VS2017 Hosted agent:
/p:AndroidNdkDirectory=”C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r13b”

これだね。

というわけでビルドタスクのオプションに、

/p:AndroidNdkDirectory="C:\Microsoft\AndroidNDK64\android-ndk-r15c"

を追加します。

これで AOT を有効にした状態の Xamarin.Android プロジェクトがビルドできるようになりました。

そういえば AOT はまだ Experimental ですね。
あと Enterprise Edition でしか使えないということだったような? まあ見なかったことにしよう。

  1. サイトには「並列ジョブ (1 か月あたり最大 1,800 分)」 とあるので、単一のジョブなら無制限なのかもしれません。 

amay077

Microsoft MVP(Xamarin). フルリモートワーカー. Geospatial Mobile app developer. Love C#.

amay077 amay077