Androidアプリのビルド、遅くて重くて、辛いですよね?
ビルド中に、ブラウジングなり、Twitterなりをすれば良いんですが、マシンが重くてまともに見れないときもあります。ラップトップのバッテリー消費も激しいですよね。
長い間、Androidアプリのビルド高速化については議論されており、様々な解決法がありますが、今回は高性能なリモートマシンを用いる方法でこれらの問題を解決します。
一見、リモートビルドは面倒な印象があると思いますが、今回はMainframerというツールとそのプラグインを用いることでサクッと仕組みを構築していきたいと思います。
Mainframerとは、リモートマシンビルドをサポートするツールのことです。ファイルの同期、ビルドコマンドの実行、生成物の転送を自動で行ってくれます。このツールがGradleに対応していて、Androidのビルドに使うことができるので、今回はこれを用います。
Mainframe、皮肉なことに時代は繰り返していくのでしょうか。
リモートマシンの準備
まず、ローカルマシンよりも高性能なリモートマシンを用意します。
自宅、学校、会社のマシンか、EC2やGCEを用いても良いでしょう。
マシンの用意ができたら、Androidアプリのビルドができるよう下準備を行いましょう。
基本的に必要なのはJDK8のインストール、Android SDKの設定(インストール、ライセンス承諾、環境変数ANDROID_HOME
の設定)です。
ここでは説明を省きますが、Androidアプリのビルド用Dockerfile作成の記事などを参考にすると良いと思います。
DockerでAndroidアプリをビルドする
少し引っかかってしまったのですが、環境変数ANDROID_HOME
をSSH経由の接続でも利用できるようにしておいてください。
[FREEBSD][LINUX] SSH経由でコマンド実行すると環境変数を読まないでござる
そして、SSH経由で公開鍵認証を用いてリモートマシンにアクセスできるように~/.ssh/config
を設定してください。
また、configに以下の記述を加えることで、連続的な接続を高速化します。
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 1h
ローカルマシンの設定
リモートマシンの準備ができたので、次はローカルマシンの設定を行いましょう。
Mainframerの作者が利用を推奨しているMainframer Integrationというプラグインを、Android Studioに導入します。
導入が完了したらCtrl+Shift+A
で表示されたダイアログでConfugure Mainframer in Project
を選択します。
Remote machine name
は先程~/.ssh/config
で設定したリモートマシンのホスト名を入力します。
Default build command
はリモートマシンで実行したいビルドコマンドを入力します。
基本的には./gradlew assembleDebug
になると思いますが、Build Variants
を切り替えたい場合は、タスク名を適宜置き換えてください。
入力が終われば、OKをクリックします。
再度、Ctrl+Shift+A
でダイアログを表示させ、Inject or restore Configuration
を選択します。
このダイアログにて、既存のConfigurationを変更します。
基本的に画像の通りにチェックすればいいでしょう。
OKをクリックします。
ビルド
さて、各種設定が終わったのでいつものようにビルドしてみましょう。
初回はSDKのダウンロード等があるので結構時間がかかります。
また、ツールバーに追加されたTurn Mainframer on/off
ボタンでリモートビルドするかローカルビルドするかスイッチすることができます。
結論
どうでしょうか。どれくらいビルドが高速化されましたか?
高速化というだけではなく、端末が重くならないというのも良いところですよね。
個人で使う分には贅沢ですが、GCEでそこそこのコア数のマシンを用いると、ビルド時間が圧倒的に短くなりますね!
みなさんも快適なビルド生活を送りましょう!