DigitalOcean に Android x86 エミュレータを飼う
VPS で KVM を動かす場合のサービスの選び方(2015 年 8 月版)の続き。
動機
エミュレータの中ではそこそこ実行速度がある Android x86 エミュレータをインターネット上に展開し、CI 基盤として用いたい。
オープンソース向け CI サービスの中には Android のテストに対応していると記載されているものも存在するが、以下の問題が存在する。
androidTest
を実行する場合には ARM エミュレータの起動が必須になるので、テストの実行速度が非常に低速- 画面なしでのエミュレータ実行が求められるので、UI メインの
androidTest
を書く場合に実行状況を確認しにくい - 複数バージョンのエミュレータを展開してのテストができない
- CI サービスの YAML 地獄辛い
なお、実行環境として、仮想化支援機構の存在する時間課金型 VPS である DigitalOcean を利用したい。
- 仮想化支援機構(
/proc/cpuinfo
のvmx
,svm
フラグ)が存在しないサービスでは x86 エミュレータが実行不能 - 常時インスタンスを起動していた場合、コスト面での負担が大きい
- インスタンスを毎回破棄することでクリーンなエミュレータを利用できる
実装
上記をベースに Ubuntu 14.04 LTS 上にエミュレーション環境を構築した。Itamae でプロビジョニングするのでbundle install
してnode.json
を用意してから、下記コマンドを叩けば動く。
$ bundle exec itamae ssh -h host -u user -j node.json recipes.rb
DISPLAY
が存在しないので、ウィンドウを有効にしてエミュレータ起動するには Xvfb が必要- Xvfb, adb server, エミュレータ自体は Supervisor でスピンアップする
- エミュレータ自体をスピンアップする際に Xvfb を待ち合わせないといけないので、ラップしたシェルスクリプトが必要
x11vnc でDISPLAY
にアタッチできるので vnc 接続もできる。
プロビジョンが終わってからインスタンスをシャットダウンしてイメージにしておくと、次回以降の立ち上げが高速化する。
雑感
- 日本国内リージョンがなく最寄りが多分シンガポールなので vnc が結構遅い
- それを抜いても Genymotion の実行速度には勝てない
- 最初は Genymotion を並べまくるという構想もあった
- 適当に立てたインスタンスで Genymotion をアクティベートしまくったら個人開発者ライセンスの上限に達したので挫折した
- まともに動かそうと思ったらメモリ 4G 以上のインスタンス推奨
- つまり常時起動すると月額 4,000 円からかかるので時間課金推奨
財力を上げてサーバで殴る
— 深澄りぜ:TGS行くかも (@Misumi_Rize) 2015, 9月 8