Android エミュレータ (AVD) で hosts による名前解決をさせるメモ


AVD にぱっと DNS で名前解決できない開発用とかのサーバーへの名前解決をさせるためのメモ。

まず方法としましては以下がぱっと浮かびます:

  1. ローカルに Proxy サーバーを立ててそこを経由する
  2. Chrome の Developer Tools の Remote Devices からポートフォワードする
  3. /etc/hosts を設定する。

(1) ですが。まず、頻繁に変えるなら Proxy サーバーを立てて設定しておくと、変更時の反映が楽そうです。

(2) について。Chrome には Developer Tools にポートフォワード機能があり、
AVD 側の localhost の任意のポートを、
ホスト側からアクセスできる任意のポートにポートフォワードしてつなげることができます。

なので、この例では localhost:9999dev.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 28Pixel_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 経由で hostspush します。
(PLATFORM_TOOLS${HOME}/Library/Android/sdk/platform-tools とかです)

これで hosts での名前解決できるようになりました。