前置き
小ネタになります
macOSにローカルサーバー立ててiOSシミュレーターとAndroidエミュレーターからアクセスする開発環境を構築しています。iOSシミュレーターはmacOSのhostsを認識しているようでしたが、Andoridエミュレーターでは別途hostsを設定する必要がありました。開発環境はmacOSを想定しています。
adb/emulatorのパスを通す
必須ではありませんがコンソールの可読性も上がりますのでパスを通しておきます。
-
.bash_profileを編集
$ vi ~/.bash_profile
-
パスを追加
AndroidStudio一式をデフォルトでインストールした場合、以下のパスになっていると思います。.bash_profileexport PATH="$PATH:$HOME/Library/Android/sdk/platform-tools" export PATH="$PATH:$HOME/Library/Android/sdk/emulator"
-
再読込み
$ source ~/.bash_profile
エミュレーターを設定する
-
対象エミュレーターを選定
$ emulator -list-avds Pixel_2_API_28
-
書込み可能状態でエミュレーターを起動
$ emulator -avd Pixel_2_API_28 -writable-system emulator: WARNING: System image is writable emulator: INFO: boot completed
-
rootを取得
前述の「書込み可能状態でエミュレーターを起動」を行うとコマンドの結果がフォアグラウンドになるので、以降のコマンドはもう1つコンソールを立ち上げて実行します。(バックグランド実行でも良いですね。)$ adb root restarting adbd as root
-
/systemを書込み可能にして再マウント
$ adb remount remount succeeded
-
hostsに書込む
AndroidシミュレーターからmacOSのローカルホストへ接続するにはIPアドレスに10.0.2.2
を指定します。127.0.0.1
ではありません。ご注意ください$ adb shell "echo 10.0.2.2 devnokiyo.example.com >> /system/etc/hosts"
なお、上記の例では追記しか出来ないので、一度AndroidエミュレーターのhostsファイルをmacOSで編集してから、Androidエミュレーターへ配置する方法も有用だと思います。
-
Androidシミュレーターのhostsを取得
$ adb pull /system/etc/hosts .
hostsを編集
-
hostsをAndroidシミュレーターへ配置
$ adb push .hosts /system/etc/hosts
-
-
非rootに変更
$ adb unroot restarting adbd as non root
-
再起動
$ adb reboot
トラブルシューティング
API28の他、API27でも試してみましたが、筆者の環境では不安定になることがあります。
「書込み可能状態でエミュレーターを起動」を行うとコマンドの結果が、途中から以下のように表示される続けることがあります。
WARNING: AsyncSocketServer.cpp:99: Error when accepting host connectionError message: Bad file descriptor
:
:
完全な解決策がわかっていないのですが、AndroidStudioやAndroidエミュレーターを再起動すると解決します。「解決」というより仕切り直しの意味合いが多いですね。
参考
Android Emulatorのhostsを書き換える方法
Android端末のhostsを書き換える方法
Androidのエミュレーターから自身のPC(localhost)へ接続
終わりに
筆者はiOS、Androidの順で開発を進めており先入観が2つありました。
- AndroidエミュレーターにもmacOSのhostsが適用されているはず
→ されてませんでした。 - hostsにローカルIP(ループバック)
127.0.0.1
を追加する
→10.0.0.22
でした。
ご参考になれば幸いです。