[Android] Android Virtual Device の /etc/hosts を書き換えて、Vagrant Virtual Machine へ接続する

AVD から VM に名前解決して接続する設定。

Android Studio 3.1.2
Build #AI-173.4720617, built on April 14, 2018
JRE: 1.8.0_152-release-1024-b01 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.13.4

前提

Vagrantfile に以下のような public_network の設定が追加されているものとします。

Vagrantfile
config.vm.network :public_network, ip: "10.0.1.100", bridge: "en1: Wi-Fi (AirPort)"

ADB (Android Debug Bridge) にパスを通しておきます。

% adb version
Android Debug Bridge version 1.0.39
Version 0.0.1-4500957
Installed as /Users/foo/Library/Android/sdk/platform-tools/adb

あなたの利用しているホスト OS(Mac) に以下のような /etc/hosts が設定されている、期待するものとします。

/etc/hosts
192.168.33.10  foo.local
10.0.1.100     bar.public

hosts ファイルを push / pull するパターン

Android Studio を起動し、AVD Manager から必要なデバイスを作成します。

作成したデバイス名を確認します。

% emulator -list-avds
Nexus_5X_API_23

バーチャルデバイスを書き込み可能なモードで起動します

% $HOME/Library/Android/sdk/tools/emulator -avd Nexus_5X_API_23 -writable-system

バーチャルデバイスの emulator 名を確認します。

% adb devices
List of devices attached
emulator-5554   device

バーチャルデバイス上の hosts ファイルを取得します。

% adb -s emulator-5554 pull /system/etc/hosts ~/Desktop/
/system/etc/hosts: 1 file pulled. 0.0 MB/s (56 bytes in 0.004s)

取得した ~/Desktop/hosts ファイルに設定を追記します。
この場合は、ローカルの VM を指定した例。

~/Desktop/hosts
192.168.33.10  foo.local

追記した ~/Desktop/hosts ファイルをバーチャルデバイスに戻します。

% adb remount
remount succeeded
% adb -s emulator-5554 push ~/Desktop/hosts /system/etc/hosts
/Users/foo/Desktop/hosts: 1 file pushed. 0.0 MB/s (85 bytes in 0.046s)

hosts 情報を書き込むパターン

前述の手順では、バーチャルデバイスの hosts ファイルを pull, push していました。
直接 echo してしまっても良いのではと考えたら、先人が居られました。

バーチャルデバイス上の hosts ファイルを取得せず、直接書き込みます。
pull, push をせず、shell をする。

% $HOME/Library/Android/sdk/tools/emulator -avd Nexus_5X_API_23 -writable-system
% adb remount
% adb shell "echo 10.0.1.100 bar.public >> /system/etc/hosts"
% adb shell cat /system/etc/hosts

補遺

本稿と直接関係しないが、実機で Chrome Dev Tools を利用する場合。