Experiments Never Fail

Azure Pipelines で Xamarin.Android の AOT Compile を使う

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

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

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

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

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

で、これも上記記事と同じです(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分/月[^a] まで無料で使うことができます。

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

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"

を追加します。

image.png

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

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

published at tags: Xamarin Azure Android