KVM の AndroidStudio で Android x86 を adb
〜 AndroidStudio と Android x86 の両方を仮想 OS へ 〜

2015-09-09 作成 福島
TOP > tips > android-kvm




0. ここでは KVM の AndroidStudio と、KVM の Android x86 の連動を扱います。

まだインストールしていない方は、あれこれをインストールしておいてください。



1. Android x86 で自身の IP アドレスを調査

前項で、KVM のゲスト OS として Android x86 をインストールしましたが、IP アドレスがわからないため、adb コマンドを使うことができません。

ホスト OS で KVM のワークファイルを参照することにより、KVM の DHCP サーバー機能が貸し出した IP アドレスを知ることができますが (下記参照) 、ここでは IP アドレスを表示するアプリを実行して確認します。
ホスト OS から KVM の DHCP サーバー機能が貸し出した IP アドレスを知る方法
# cat /var/lib/libvirt/dnsmasq/default.leases
1441701163 52:54:00:98:b7:d4 192.168.122.163 android-8421de533efe41db 01:52:54:00:98:b7:d4
1441702194 52:54:00:85:c1:b5 192.168.122.149 AndroidStudio *
#

使ったのは、My IP address
これは、WiFi のアクセス許可を求めるくせに、表示されるのは有線の IP アドレスだけという、変な動作をしてくれます。(バグか?)
他に IP Tools も良いと思います。

IP アドレスが 192.168.122.163 ということがわかります。


2. CentOS 上の AndroidStudio から adb コマンドで Android x86 に接続

同じ KVM の CentOS に ssh でログインし、adb コマンドで接続します。
この CentOS には AndroidStudio がインストールされています。

2-1. adb で android x86 に接続
$ ~/Android/Sdk/platform-tools/adb connect 192.168.122.163
connect to 192.168.122.163:5555
 ← 接続されました。

2-2. AndroidStudio を起動
$ ~/android-studio/bin/studio.sh

2-3. アプリケーションの起動
AndroidStudio のメニュー Run | Run 'app' を選択すると…


Build が開始されて…


デバイス選択に Android x86 を選択できるようになっています。
Choose Device
Choose a running device
DeviceSerial NumberStateCompatible
Red Hat KVM Android 4.4.4 (API 19)



192.168.122.163



Online



Yes         



  ↑

2-4. Red Hat KVM Android 4.4.4 (API 19) を選択する
特にエラーは無い模様

2-5. 画面を Android x86 に切り替える
画面に Hellow world! の表示
実行できています。



3. AndroidStudio を VNC で表示

3-1. AndroidStudio の CentOS に外部接続用の NIC を設置

CentOS (AndroidStudio が乗っているゲスト) を停止させてから外部接続用の NIC を追加
NIC を追加
  ・ソースデバイス: macvtap
  ・デバイスモデル: virtio
  ・Source mode: bridge
Source mode は VEPA でも良い。(KVM 間の通信は仮想ハブ間で行うため)

3-2. 追加した NIC を活性化
ネットワーク接続の画面を開いて、追加された NIC を編集する



手動接続が面倒なので、自動接続にしておく
ついでに、MAC アドレスを確認する (追加したときと同じはず)


同じネットワークに DHCP サーバーがあるので、ここでは DHCP を選択しています。
もちろん、固定 IP アドレスでも可。


DHCP にしたので、割り当てられた IP アドレスを確認。(この IP アドレスに VNC クライアントから接続する)
$ ifconfig
…
eth1      Link encap:Ethernet  HWaddr 52:54:00:53:63:8A
          inet addr:192.168.1.51  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe53:638a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8529 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9380 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:682816 (666.8 KiB)  TX bytes:2883787 (2.7 MiB)
…
$
  ↑


3-3. VNC サーバー (vino-server) の設定
リモート・デスクトップの設定画面を開く


チェックを入れる
リモート・デスクトップの設定
共有
  ■他のユーザが自分のデスクトップを表示できる(Y)
    ■他のユーザがデスクトップを操作できる(A)

3-4. ファイアウォールの設定
ファイアウォールの設定を開く


VNC サーバーのポート (5900/tcp) を開ける

3-5. AndroidStudio (CentOS) を VNC クライアントから接続

ここでは、Windows 用 VNC サーバー/クライアント ソフトの TightVNC を使用しています。
クライアントは TightVNC Viewer です。
VNC クライアントからの接続


接続できました。
ちゃんと AndroidStudio も動作しています。




4. Android x86 を VNC で表示

Android x86 は VNC サーバー機能がありません。
"droid VNC server" をインストールすると VNC サーバーが動作するのですが、これは ARM プロセッサ用です。

しかし、これを x86 用にコンパイルしてそのバイナリファイルを公開してくれた方がいるので、それ "droidvnc_x86" を使用します。

4-1. droid_x86 をダウンロード
ダウンロードしたバイナリファイルは adb コマンドで Android x86 へ転送するため、adb コマンドが存在する端末で用意する


Dropbox に保存されています。


ダウンロードを試みると Dropbox からアカウント作成を催促されますが、アカウントを作成しなくてもダウンロードすることができます。


4-2. Android x86 に droidvnc_x86 を設置
droidvnc_x86 をダウンロードした端末から adb コマンドで Android x86 へ接続

$ ~/Android/Sdk/platform-tools/adb connect 192.168.122.163
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
connected to 192.168.122.163:5555
転送先ディレクトリーのパーミッションを確認 (変更前)

$ ~/Android/Sdk/platform-tools/adb shell 'su root ls -ld /system/bin'
drwxr-xr-x root     shell             2015-09-06 15:57 bin
転送先ディレクトリーのパーミッションを変更 (ユーザー 'shell' では書き込めない)

$ ~/Android/Sdk/platform-tools/adb shell 'su root chmod 777 /system/bin'
$ ~/Android/Sdk/platform-tools/adb shell 'su root ls -ld /system/bin'
drwxrwxrwx root     shell             2015-09-06 15:57 bin
バイナリファイルを転送する

$ ~/Android/Sdk/platform-tools/adb push ~/ダウンロード/droidvnc_x86 /system/bin/
6041 KB/s (287431 bytes in 0.046s)
転送先ディレクトリーのパーミッションを戻す

$ ~/Android/Sdk/platform-tools/adb shell 'su root chmod 755 /system/bin'
$ ~/Android/Sdk/platform-tools/adb shell 'su root ls -ld /system/bin'
drwxr-xr-x root     shell             2015-09-09 16:29 bin
4-3. Android x86 に外部接続用の NIC を設置

Android x86 を停止させずに外部接続用の NIC を追加
NIC を追加
  ・ソースデバイス: macvtap
  ・デバイスモデル: virtio
  ・Source mode: VEPA

4-4. 追加した NIC を有効化
$ ~/Android/Sdk/platform-tools/adb shell
$ su
# netcfg
NIC 追加前
lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
eth0     UP                             192.168.122.163/24  0x00001043 52:54:00:98:b7:d4
sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
ip6tnl0  DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00

NIC 追加直後
lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
eth0     UP                             192.168.122.163/24  0x00001043 52:54:00:98:b7:d4
eth1     DOWN                                   0.0.0.0/0   0x00001002 52:54:00:4a:77:d8
sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
ip6tnl0  DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
eth1 を DHCP クライアントとして Link-UP させる

# netcfg eth1 dhcp
eth1 は 192.168.1.55/24 として Link-UP した
lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00
eth0     UP                             192.168.122.163/24  0x00001043 52:54:00:98:b7:d4
eth1     UP                                192.168.1.55/24  0x00001043 52:54:00:4a:77:d8
sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
ip6tnl0  DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00
# exit
$ exit
4-5. Android x86 で VNC サーバーを起動
droidvnc_x86 を起動
※通常ユーザーでも起動できますが、その時は見るだけ (操作できない) になります。

$ ~/Android/Sdk/platform-tools/adb shell
$ su
# /system/bin/droidvnc_x86 &
[1] 3866
Initializing framebuffer device...
line_lenght=1600 xres=800, yres=600, xresv=800, yresv=600, xoffs=0, yoffs=0, bpp=16
colourmap_rgb=11:5:0    lenght=5:6:5Using Droid workaround
Initializing virtual keyboard and touch device...
cannot create virtual kbd device.
Initializing VNC server:
        width:  800
        height: 600
        bpp:    16
        port:   5901
Initializing server...
09/09/2015 20:35:09 Listening for VNC connections on TCP port 5901
09/09/2015 20:35:09 Listening for HTTP connections on TCP port 5801
09/09/2015 20:35:09   URL http://localhost:5801
# ps | grep 3866
root      3866  3854  5548   388   c10ec8b0 40082a20 S /system/bin/droidvnc_x86
#
4-6. Android x86 を VNC クライアントから接続

上記同様、TightVNC Viewer を使用。
VNC クライアントからの接続。ポートは 5901 を使用する。



AndroidStudio の動作結果も表示可能
※ VNC なので、音声の再現はできない

4-7. VNC サーバーの除去

droidvnc_x86 が起動すると Android x86 インストール時に自動的に入る VNC サーバー機能を削除してもかまいません。

削除すると、ホスト OS から Android x86 への GUI が使えなくなるので、それが必要な方は削除しないでください。
VNC サーバーを再作成すると元に戻ります。
VNC サーバーの削除


起動画面 (GRUB) も表示されません。