マルチデバイスのインタラクションを伴うアプリをテストするには、複数の Android Emulator インスタンスを接続して、相互に通信できるようにします。接続を確立する方法は、使用しているエミュレータのバージョンによって異なります。
Android エミュレータ バージョン 36.5 以降
Android Emulator バージョン 36.5 以降では、共有 Wi-Fi ネットワーク経由でインスタンスを接続する、簡素化されたネットワーキング モデルが提供されています。
このネットワーキング スタックを使用すると、複数のエミュレータが同じ仮想 Wi-Fi ネットワーク上の個別のデバイスとして表示されます。これにより、標準の Wi-Fi ベースのプロトコルを使用して、自動的に検出して通信できるようになります。
エミュレータは、ネットワーク サービス ディスカバリ(NSD)や Wi-Fi Direct などのテクノロジーを使用して、仮想ネットワーク上で互いを検出できます。
エミュレータは同じ Wi-Fi ネットワーク上にあるため、エミュレータの特定の IP アドレスを見つけて、別のエミュレータ インスタンスから直接接続することもできます。仮想 Wi-Fi インターフェース(wlan0)の IP アドレスを取得するには、ホストマシンから次のコマンドを実行します。
adb shell ip addr show wlan0
Android Emulator バージョン 36.5 より前
以前のバージョンの Android エミュレータを使用している場合、インスタンス間の直接通信はデフォルトではできません。各エミュレータ インスタンスは独自の仮想ルーターの背後で動作し、ローカル ネットワークや他のエミュレータから分離されます。
通信を有効にするには、ネットワーク リダイレクトを手動で設定する必要があります。このプロセスでは、ホストマシンの特定のポートからエミュレートされたデバイスのポートにトラフィックを転送し、仮想ルーターをバイパスするマッピングを作成します。
ネットワーク リダイレクトは、次の 2 つの方法で構成できます。
- エミュレータ コンソール コマンド: 組み込みのコンソールを使用して、実行中のエミュレータ インスタンスのポート マッピングを設定します。
- Android Debug Bridge(adb): adb コマンドを使用して、必要なポート転送ルールを構成します。
エミュレータ コンソールでリダイレクトをセットアップする
各エミュレータ インスタンスには制御コンソールが用意されており、これに接続して各インスタンスに固有のコマンドを発行できます。redir コンソール コマンドを使用して、エミュレータ インスタンスでの必要性に応じてリダイレクトをセットアップします。
最初に、ターゲットのエミュレータ インスタンスのコンソール ポート番号を特定します。たとえば、最初に起動したエミュレータ インスタンスのコンソールのポート番号が 5554 だとします。次に、以下のようにコンソール ポート番号を指定して、ターゲットのエミュレータ インスタンスのコンソールに接続します。
telnet localhost 5554
接続したら、リダイレクトをセットアップする前に認証を行う必要があります。その方法について詳しくは、コンソール セッションを開始、停止するをご覧ください。認証したら、redir コマンドを使用してリダイレクトを操作します。
リダイレクトを追加するには、次のコマンドを使用します。
redir add <protocol>:<host-port>:<guest-port>
ここで、<protocol> は tcp または udp です。<host-port> と <guest-
port> は、マシンとエミュレートしたシステムの間のマッピングを設定します。
たとえば、次のコマンドは、127.0.0.1:5000 のホスト(開発)マシンへのすべての着信 TCP 接続を処理するリダイレクトをセットアップし、10.0.2.15:6000 のエミュレートしたシステムに渡します。
redir add tcp:5000:6000
リダイレクトを削除するには、redir del コマンドを使用します。特定のインスタンスのすべてのリダイレクトを一覧表示するには、redir list を使用します。こうしたコンソール コマンドの詳細については、エミュレータ コンソール コマンドを送信するをご覧ください。
ポート番号はローカル環境によって制限されます。通常、特別な管理者権限がないと 1024 未満のホストポート番号を使用できません。また、マシン上の別のプロセスですでに使用されているホストポートに対してリダイレクトを設定することはできません。設定した場合、redir はその旨を示すエラー メッセージを生成します。
adb でリダイレクトをセットアップする
Android Debug Bridge(adb)ツールは、ポート転送の機能を提供します。これにより、上記の方法とは別の方法でネットワーク リダイレクトをセットアップできます。詳細については、adb のドキュメントのポート転送をセットアップするをご覧ください。
現在のところ adb には adb サーバーを停止する以外にリダイレクトを削除する方法がありません。
エミュレータ インスタンスを相互接続する
あるエミュレータ インスタンスを別のエミュレータ インスタンスと通信できるようにするには、次の手順でネットワーク リダイレクトをセットアップします。
次のような環境を想定します。
- A は開発マシンです。
- B は、A で実行される最初のエミュレータ インスタンスです。
- C は 2 番目のエミュレータ インスタンスであり、これも A で実行されます。
B でサーバーを動作させ、C がそのサーバーに接続する場合は、次のようにセットアップします。
- B のサーバーが
10.0.2.15:<serverPort>をリッスンするよう設定します。 - B のコンソールで、A:
localhost:<localPort>から B:10.0.2.15:<serverPort>へのリダイレクトを設定します。 - C で、クライアントを
10.0.2.2:<localPort>に接続します。
たとえば、HTTP サーバーを実行する場合は、<serverPort> を 80 に、<localPort> を 8080 にします。
- B は
10.0.2.15:80でリッスンします。 - B のコンソールで、
redir add tcp:8080:80を発行します。 - C が
10.0.2.2:8080に接続します。