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 での名前解決できるようになりました。