Android仮想デバイスとDocker開発環境をつなぐ
エンジニアの佐藤です。こんにちは。
Android開発を始めました。Android開発と言えば、Android Studioです。まずは正攻法でいこうと思いました。
ところで筆者は趣味のプログラミングのほとんどと、可能な限りの業務開発をクラウドの仮想デスクトップDockerコンテナ上で行なっています。技術が好きという個人的理由もありますが、常日頃慣れることで技術の細部まで知見が深まる効果を狙ってのものです。
ところがこのDocker仮想デスクトップ、Android開発と決定的に競合してしまうことがわかりました。問題はデバッグ環境となるAndroid仮装デバイス(AVD)です。理由は割愛しますが、つまるところAVDは、ハードウェアに直接インストールしてあるローカルOSでしか動かず、クラウド上では実行できないのです。
往生際の悪い筆者は、今度は(クラウド上の)Docker仮想デスクトップコンテナと、ローカルで実行されるAVDを接続することを考えました。今回はこの話を書かせていただきたいと思います。
以下がその目論見図となります。
ネットワークは以下のようになります。
AVDは通常、ポート5554と5555で着信待機しています(*1)。Android Studioはadbと呼ばれる仕掛け(コマンドプログラムとデーモンで構成)でAVD(あるいは実機)と通信しますので、この部分をSSHトンネルで仲介すれば、目論見が実現しそうです。
試してみましょう。
Docker仮想デスクトップサーバについては以下の筆者ブログを参考にします。
DockerでLinux仮想デスクトップサーバをつくる話
次にローカル環境にAndroid Studioをインストールし、AVDを一つ作成します。
ここでは「Nexus_6_API_24」という名前で作成しました。作成したら、一旦Android Studioは終了します。
ここで例の「SSHトンネル」を仕掛けます。以下のコマンドは「SSH接続がある限り、リモートホスト(この場合はDocker仮想デスクトップコンテナ)で5554または5555ポートに向かって接続された場合、その接続をローカルの5554または5555ポートにフォワードする」という意味になります。これをローカル環境から実行します。(vncserverはリモートホストのホスト名)
$ssh user01@vncserver -R 5555:localhost:5555 -R 5554:localhost:5554
リモートホスト側で確認してみましょう。
$ netstat -ltnp (中略) tcp 0 0 127.0.0.1:5554 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:5555 0.0.0.0:* LISTEN -
目論見通りフォワーディングされそうです。
リモートホストでAndroid Studioを起動します。
ローカル環境でAVDを起動します。筆者のMacOS環境では、ターミナルから以下のように入力します。
$ ~/Library/Android/sdk/emulator/emulator @Nexus_6_API_24
AVDが起動したら、リモートホストで実行しているAndroid Studioからデバッガーのアタッチが可能か見てみましょう。メニューを「Run -> Attach debugger to Android process」で選択すると、以下のダイアログが表示され、ローカル環境のAVDが接続されたことが確認できました。
インラインデバッガでデバッグしてみましょう。メニューを「Run -> Debug 'app'」と選択し、先ほど確認されたデバイスを選びます。
ブレークポイントでブレークできました!これでいつものやり方でAndroid開発をやっていけそうです。
手前のAVDがMacOSローカルで実行され、背景のAndroid Studioは仮想デスクトップクライアントで接続されたDocker上の環境で実行されています。
おわりに
ここまで読んでいただいてありがとうございます。「なんでわざわざ難しいことするの?」と思われた方も多いでしょう。普通は1台の開発マシンでやることをわざわざ分散しているのです。しかし、メリットもあると思います。
ローカルPCへのリソース投資が少なくて済む
クラウドとネットワークがどこでも使えるようになったので、ローカルPCへの固定費支出は抑え、なるべく従量課金のクラウドを使った方が安上がりです。今回紹介した手法は、開発設備の柔軟性を向上させます。
AVDに多量のリソースを割り当てられる
メモリ8GBの標準的なノートPCでは、メモリ4GBのAVDとAndroid Studioを同時実行するのは難しいでしょう。またAVDを2台以上起動したい場合も、今回の手法が役立つと思います。
今回ご紹介した手法が何かしらのお役に立てば幸いです。
(*1)以下のAndroid Debug Bridgeに詳しく書かれている
https://developer.android.com/studio/command-line/adb.html
コメント