DigitalOcean に Android x86 Atom エミュレータを飼う


動機

エミュレータの中ではそこそこ実行速度がある Android x86 エミュレータをインターネット上に展開し、CI 基盤として用いたい。

オープンソース向け CI サービスの中には Android のテストに対応していると記載されているものも存在するが、以下の問題が存在する。

  • androidTestを実行する場合には ARM エミュレータの起動が必須になるので、テストの実行速度が非常に低速
  • 画面なしでのエミュレータ実行が求められるので、UI メインのandroidTestを書く場合に実行状況を確認しにくい
  • 複数バージョンのエミュレータを展開してのテストができない
  • CI サービスの YAML 地獄辛い

なお、実行環境として、仮想化支援機構の存在する時間課金型 VPS である DigitalOcean を利用したい。

  • 仮想化支援機構(/proc/cpuinfovmx, 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 の実行速度には勝てない
  • まともに動かそうと思ったらメモリ 4G 以上のインスタンス推奨
    • つまり常時起動すると月額 4,000 円からかかるので時間課金推奨