visible true

技術的なメモを書く

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

f:id:sys1yagi:20161113153138p:plain

ゾーンはおそらくasia-northeast1とかの方がいいんでしょうが、転送の速度よりはビルド速度の方が大きい影響を受けると思うので、安いゾーンでCPU積んだ方が体験としてはよさそうです。

静的IPを追加する

rsyncを使うのでインスタンスのIPを固定します。静的IPはインスタンスの編集画面で追加できます。

f:id:sys1yagi:20161113154544p:plain

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の設定

.bashrcANDROID_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を専有しないように出来るというだけでもかなり価値がありそうです。コストについてはまだ環境を作って間もないのでなんとも言えないですが、インスタンスを使う時だけ起動すればよいのでかなり低コストに抑えられるのではないかと思います。