Xamarin.Forms で簡単なアプリを作って、その Android 版を社内向けに配布しようとしたんですけど、 .apk のサイズが 60Mbyte超 もあって、「仕方ないよね…」と思いながら、 モバイル回線でそれをダウンロードさせるのかー、と思うと良心の呵責を感じてしまい、可能な限りで apk のサイズを縮小することを試みました。
apk サイズの削減については、
を参考にさせていただきました。当該記事は「起動時間」にフィーチャーしていますが、サイズ縮小についても十分に有用です。
最終的に落ち着いたコンパイルオプションは、
で、これも上記記事と同じです(LLVM は使ってません)。 この結果 apk のサイズは 60Mbyte超 → 33Mbyte になりました。
(上記に比べてさらに、「Linker - Link all assemblies」 とすれば 25Mbyte にまで削減できましたが、このアプリは起動せず、「リンクしたらマズそうなアセンブリ」を Ignore assemblies に追加していったら起動するようにはなったものの apk は 29Mbyte になったので、かけるコストに対して効果は薄そうだと判断してやめました。)
ここまではアプリのビルドの話で、次からが本題です。
Azure Pipelines は Azure DevOps というサービスに含まれるサブサービスの一つで、CI/CD の機能を提供します。
Android, iOS, Linux, macOS, Windows 用のアプリをビルド・デプロイできます。 OSS向けならビルド時間は無制限、個人プライベート向けでも1800分/月a まで無料で使うことができます。
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 に凸! すると、
Thanks for reaching out! We rely on Visual Studio to install the Android NDK. This thread with a similar scenario might come in handy: https://t.co/rSqfEaoLhS.
— Azure DevOps (@AzureDevOps) 2018年11月29日
「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 でしか使えないということだったような? まあ見なかったことにしよう。