[Android] Android Virtual Device の /etc/hosts を書き換えて、Vagrant Virtual Machine へ接続する
AVD から VM に名前解決して接続する設定。
[markdown]
“`prettyprinted
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` の設定が追加されているものとします。
> * [[Vagrant & VirtualBox] Vagrant: 同じLAN内の端末から仮想マシンにアクセスする | deadwood](https://www.d-wood.com/blog/2014/06/13_6344.html)
“`ruby:Vagrantfile
config.vm.network :public_network, ip: “10.0.1.100”, bridge: “en1: Wi-Fi (AirPort)”
“`
ADB (Android Debug Bridge) にパスを通しておきます。
> * [[Android] macOS に Android Debug Bridge をセットアップする | deadwood](https://www.d-wood.com/blog/2018/04/02_9491.html)
“`prettyprinted
% 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` が設定されている、期待するものとします。
“`prettyprinted:/etc/hosts
192.168.33.10 foo.local
10.0.1.100 bar.public
“`
## hosts ファイルを push / pull するパターン
Android Studio を起動し、AVD Manager から必要なデバイスを作成します。
> * [仮想端末の作成と管理 | Android Developers](https://developer.android.com/studio/run/managing-avds)
作成したデバイス名を確認します。
“`prettyprinted
% emulator -list-avds
Nexus_5X_API_23
“`
バーチャルデバイスを書き込み可能なモードで起動します
“`prettyprinted
% $HOME/Library/Android/sdk/tools/emulator -avd Nexus_5X_API_23 -writable-system
“`
バーチャルデバイスの emulator 名を確認します。
“`prettyprinted
% adb devices
List of devices attached
emulator-5554 device
“`
バーチャルデバイス上の hosts ファイルを取得します。
“`prettyprinted
% 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 を指定した例。
“`prettyprinted:~/Desktop/hosts
192.168.33.10 foo.local
“`
追記した `~/Desktop/hosts` ファイルをバーチャルデバイスに戻します。
“`prettyprinted
% 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)
“`
> * [Start the Emulator from the Command Line | Android Developers](https://developer.android.com/studio/run/emulator-commandline)
> * [Setting /etc/hosts on an Android Emulator using a Mac | BorkWeb](http://borkweb.com/story/setting-etchosts-on-an-android-emulator-using-a-mac)
> * [How to edit /etc/hosts file in Android Studio emulator running in nougat? – Stack Overflow](https://stackoverflow.com/questions/41117715/how-to-edit-etc-hosts-file-in-android-studio-emulator-running-in-nougat)
## hosts 情報を書き込むパターン
前述の手順では、バーチャルデバイスの hosts ファイルを `pull`, `push` していました。
直接 `echo` してしまっても良いのではと考えたら、先人が居られました。
> * [Android エミュレータの hosts ファイルを編集 – なんとなくな Developer のメモ](http://fits.hatenablog.com/entry/2015/12/20/181217)
バーチャルデバイス上の hosts ファイルを取得せず、直接書き込みます。
`pull`, `push` をせず、`shell` をする。
“`prettyprinted
% $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 を利用する場合。
> * [Android 端末のリモート デバッグを行う | Tools for Web Developers | Google Developers](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/?utm_source=dcc&utm_medium=redirect&utm_campaign=2016q3#port-forwarding)
[/markdown]