AndroidアプリケーションをGoogle Compute Engineのインスタンスでビルドする
AndroidのBuildを別マシンで行うスクリプト書いたった - Qiitaがとても興味深かったので、Google Compute Engineのインスタンスでビルドする環境の構築を試してみました。体験としては最高だったので、環境構築の手順を簡単にまとめます。
解決したいこと
前述の記事で語られている通り、Androidアプリケーションのビルドはとても時間がかかります。しかもCPUをフルで持っていくのでビルドしているあいだは他の事ができません。そこでビルドの処理を別のマシンに委譲することで、待っている時間を有効に使えるようにします。
Google Compute Engineのインスタンスを作る
まずGoogle Compute Engineのインスタンスを作ります。環境としては次を選択しました。
- ゾーン: asia-east1-a - CPU: vCPUx2 (n1-standard-2) - OS: Ubuntu 16.4 LTS - ディスク: 20GB
ゾーンはおそらくasia-northeast1とかの方がいいんでしょうが、転送の速度よりはビルド速度の方が大きい影響を受けると思うので、安いゾーンでCPU積んだ方が体験としてはよさそうです。
静的IPを追加する
rsyncを使うのでインスタンスのIPを固定します。静的IPはインスタンスの編集画面で追加できます。
ssh keyの登録
インスタンスのAndroid開発環境を整えるため、sshでアクセスします。ドキュメントの手順に沿ってキーを作成して登録します。
Connecting to Linux Instances | Compute Engine Documentation | Google Cloud Platform
javaのインストール
インスタンスにsshでログインし、必要なソフトウェアをインストールします。まずはjavaの環境を整えます。
sudo apt-get update
sudo apt-get install openjdk-8-jdk-headless
Android SDKのインストール
次にAndroid SDKをインストールします。場所はどこでも構いません。今回は~/
に置いてます。
wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz tar xvf android-sdk_r24.4.1-linux.tgz
ANDROID_HOMEの設定
.bashrc
にANDROID_HOMEと、androidコマンドのパスを設定します。
vim ~/.bashrc export ANDROID_HOME=~/android-sdk-linux PATH=$PATH:$ANDROID_HOME/tools
android update
androidコマンドを使ってビルドツールなどをインストールします。大体次でよさそうです。不足したものがあれば適宜入れてください。
android update sdk -u -t 1,2,3,4
license fileの作成
アプリケーションのビルド時にライセンス同意のファイルが必要です。ローカル環境の$ANDROID_HOME/licenses/android-sdk-license
の内容をリモートインスタンス側にコピーします。
mkdir $ANDROID_HOME/licenses vim $ANDROID_HOME/licenses/android-sdk-license # localの`$ANDROID_HOME/licenses/android-sdk-license`の内容をコピーする
/tmp/buildディレクトリの作成
※追記 2016/11/14: インスタンスを再起動するとtmp/buildが毎回消えてしまってめんどくさいので、~/でやるようにgistのコードを更新しました。なのでこの節は省いて大丈夫です
次の項目のfabfile.pyでワーキングディレクトリとして/tmp/buildを使っています。最初は存在しないので、予め作っておく必要があります。
mkdir -p /tmp/build
fabfile.pyの準備
AndroidのBuildを別マシンで行うスクリプト書いたった - Qiitaで掲載されているgistのコードをforkし、少しだけ変更しました。
https://gist.github.com/sys1yagi/1f395190061a8d48db5e30ae160b4b99
設定項目は次のとおりです。
- env.user = sshのユーザ名
- env.hosts = VMインスタンスのIP
- env.key_filename = VMインスタンスに登録したSSHキーファイル
- module = ビルドするモジュール名
- flavor = ビルドするフレーバー名
- package = アプリケーションのパッケージ名
- launch_activity = 起動するアクティビティのFQCN
これでfab build
でビルドできるはずです。
おわりに
vCPUx2 (n1-standard-2)のインスタンスの場合、手元でのビルドの3倍程度時間がかかるようでした。この辺はプロジェクトやローカルマシンのスペックなどによって様々と思いますが、インスタンスのスペックを積めばローカルより速いビルドも実現できるでしょう。
リモートでのビルドは、ローカルマシンのCPUを専有しないように出来るというだけでもかなり価値がありそうです。コストについてはまだ環境を作って間もないのでなんとも言えないですが、インスタンスを使う時だけ起動すればよいのでかなり低コストに抑えられるのではないかと思います。