TL;DR
経緯
10.0.2.2 でホストにアクセスできるが、ホスト名でアクセスしたい時がある (サブドメインで区切られたマルチテナントなシステムとか) ので、試行錯誤してみた
シミュレータ (AVD) からのアクセスをホストで起動した proxy で処理するパターン
Squid インストール
macOS 前提です。
$ brew install squid
動作確認したのは squid-3.5.27
設定ファイル編集
必要であればよく使うポートを開けておくとよい (acl Safe_ports port 1025-65535» # unregistered ports
は設定されている)
$ vi /usr/local/etc/squid.conf
# 例 acl Safe_ports port 4200 acl Safe_ports port 8000 acl Safe_ports port 8080 acl Safe_ports port 9292
起動・停止・再起動
$ brew services run squid $ brew services stop squid $ brew services restart squid
ログ確認
$ tail -f /usr/local/var/logs/access.log # squid access_log
AVD からのローカルホストアクセス
コマンドラインから adb でエミュレータ起動する際に引数で渡したり、AVD の GUI 設定からプロキシを設定しても 127.0.0.1 が AVD 自身にループバックされているようで期待した動作にならなかった。
参考: Set up Android Emulator networking | Android Developers
通常の Android の Wi-Fi 設定でプロキシを手動設定する*1。
参考: Connect to Wi-Fi networks on your Android device - Android Help
プロキシのホストは Squid が起動している開発サーバ の Local IP、Squid のデフォルトポートは 3128
動作確認
lvh.me が 127.0.0.1 を返してくれるので、それにアクセスすると開発サーバの localhost にアクセスしてくれる。
(AVD 上の) http://lvh.me:8080 => (開発サーバの) http://127.0.0.1:8080
シミュレータ (AVD) 内の hosts を書き換えるパターン
事前に emulator
や adb
コマンドにパスを通しておいたほうが楽だが、今回は省略するのでフルパスで記載。
バーチャルデバイス (シミュレータ) 起動
$ # avd 名を確認 $ /Users/${HOME}/Library/Android/sdk/emulator/emulator -list-avds Pixel_2_API_28 $ # avd を指定してエミュレータを起動 (書き換えるので、writable を指定する) $ /Users/${HOME}/Library/Android/sdk/emulator/emulator -avd Pixel_2_API_28 -writable-system
Android Debug Bridge でバーチャルデバイスを操作
$ # デバイスの確認 $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb devices List of devices attached emulator-5554 device $ $ # root になる $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb root $ $ # デバイスをアタッチ $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb remount $ $ # アタッチの確認 $ /Users/${HOME}/Library/Android/sdk/platform-tools/adb devices List of devices attached emulator-5554 device
バーチャルデバイス上の hosts を書き換える
$ # バーチャルデバイスから hosts ファイルを取得 $ ~/library/android/sdk/platform-tools/adb -s emulator-5554 pull /system/etc/hosts ~/tmp/ /system/etc/hosts: 1 file pulled. 0.0 MB/s (56 bytes in 0.004s) $ $ # 追記 (10.0.2.2 はホストのアドレス) $ echo '10.0.2.2 lvh.me' >> ~/tmp/hosts $ $ # 追記したファイルをバーチャルデバイスに上書き配置 $ ~/library/android/sdk/platform-tools/adb -s emulator-5554 push ~/tmp/hosts /system/etc/hosts
参考
- Android Studio AVD (エミュレータ) からデスクトップのローカルホストに接続させる設定 - 長生村本郷Engineers'Blog
- [Android] Android Virtual Device の /etc/hosts を書き換えて、Vagrant Virtual Machine へ接続する | deadwood
*1:端末により設定方法は変わります