AVD にぱっと DNS で名前解決できない開発用とかのサーバーへの名前解決をさせるためのメモ。
まず方法としましては以下がぱっと浮かびます:
- ローカルに Proxy サーバーを立ててそこを経由する
- Chrome の Developer Tools の Remote Devices からポートフォワードする
-
/etc/hosts
を設定する。
(1) ですが。まず、頻繁に変えるなら Proxy サーバーを立てて設定しておくと、変更時の反映が楽そうです。
(2) について。Chrome には Developer Tools にポートフォワード機能があり、
AVD 側の localhost
の任意のポートを、
ホスト側からアクセスできる任意のポートにポートフォワードしてつなげることができます。
なので、この例では localhost:9999
は dev.api.org:80
につながるようになります。
ただ仮想ホストへのアクセスの場合は、
Host
ヘッダーを自分で指定する必要があります。
(もしコードに変更を加えられるのであれば、Retrofit2 の Interceptor
でヘッダーを指定するとかできますが、ちょっとめんどうですね)。
(3) の /etc/hosts/
は、ホストと IP の対応を手軽に自分のマシン内で名前解決するのに便利ですね。今回はこれを使います:
まず AVD を書き込み可能にする
${SDK_PATH}/emulator/emulator -writable-system -avd "${AVD_NAME}" &
SDK_PATH
は Android SDK ホームへのパス。
mac だったら ${HOME}/Library/Android/sdk/
とかですね。
AVD_NAME
は起動したい AVD の名前です。
スペースは _
に置き換えます。
(例: Pixel 2 XL API 28
→ Pixel_2_XL_API_28
)
これで AVD が書き込み可能で起動します。
(Play Store が有効だと無理っぽいです)。
ホストの hosts
を AVD に push する
cd ${PLATFORM_TOOLS}
./adb root
./adb remount
./adb pull /system/etc/hosts /tmp
cat /etc/hosts >> /tmp/hosts
./adb push /tmp/hosts /system/etc/hosts
で、今起動中の AVD に対して adb
経由で hosts
を push
します。
(PLATFORM_TOOLS
は ${HOME}/Library/Android/sdk/platform-tools
とかです)
これで hosts
での名前解決できるようになりました。