Android Emulator-Netzwerk einrichten

Der Emulator bietet vielseitige Netzwerkfunktionen, mit denen Sie komplexe Modellierungs- und Testumgebungen für Ihre App einrichten können. Auf dieser Seite werden die Netzwerkarchitektur und die Funktionen des Emulators vorgestellt.

Netzwerkadressraum

Jede Instanz des Emulators wird hinter einem virtuellen Router oder Firewall-Dienst ausgeführt, der sie von den Netzwerkschnittstellen und Einstellungen Ihres Entwicklungscomputers und vom Internet isoliert. Ein emuliertes Gerät kann Ihren Entwicklungscomputer oder andere Emulatorinstanzen im Netzwerk nicht erkennen. Es wird nur erkannt, dass eine Ethernet-Verbindung zu einem Router oder einer Firewall besteht.

Der virtuelle Router für jede Instanz verwaltet den Netzwerkadressbereich 10.0.2/24. Alle vom Router verwalteten Adressen haben das Format 10.0.2.xx, wobei xx eine Zahl ist. Adressen in diesem Bereich werden vom Emulator oder Router wie folgt vorab zugewiesen:

Netzwerkadresse Beschreibung
10.0.2.1 Router- oder Gateway-Adresse
10.0.2.2 Spezieller Alias für die Host-Loopback-Schnittstelle (127.0.0.1 auf Ihrem Entwicklungscomputer)
10.0.2.3 Erster DNS-Server
10.0.2.4 / 10.0.2.5 / 10.0.2.6 Optionaler zweiter, dritter und vierter DNS-Server
10.0.2.15 Das Netzwerk des emulierten Geräts bei einer Verbindung über Ethernet
10.0.2.16 Das Netzwerk des emulierten Geräts, wenn es über WLAN verbunden ist
127.0.0.1 Die Loopback-Schnittstelle des emulierten Geräts

Alle laufenden Emulatorinstanzen verwenden dieselben Adresszuweisungen. Wenn Sie also zwei Instanzen gleichzeitig auf Ihrem Computer ausführen, hat jede einen eigenen Router und dahinter eine IP-Adresse von 10.0.2.15. Die Instanzen sind durch einen Router isoliert und können sich nicht im selben Netzwerk erkennen. Informationen dazu, wie Emulatorinstanzen über TCP/UDP kommunizieren können, finden Sie im Abschnitt Emulatorinstanzen verbinden.

Die Adresse 127.0.0.1 auf Ihrem Entwicklungscomputer entspricht der Loopback-Schnittstelle des Emulators. Wenn Sie auf Dienste zugreifen möchten, die auf der Loopback-Schnittstelle Ihres Entwicklungscomputers ausgeführt werden, verwenden Sie stattdessen die spezielle Adresse 10.0.2.2.

Die vorab zugewiesenen Adressen eines emulierten Geräts sind spezifisch für den Android-Emulator und unterscheiden sich wahrscheinlich stark von denen auf echten Geräten, die wahrscheinlich auch per Network Address Translation (NAT) übersetzt werden, insbesondere hinter einem Router oder einer Firewall.

Einschränkungen für lokale Netzwerke

Android-Apps, die auf einem Emulator ausgeführt werden, können eine Verbindung zum Netzwerk auf Ihrer Workstation herstellen. Apps stellen jedoch eine Verbindung über den Emulator her, nicht direkt zur Hardware. Der Emulator verhält sich wie eine normale App auf Ihrer Workstation. Das kann zu Einschränkungen führen:

  • Die Kommunikation mit dem emulierten Gerät wird möglicherweise durch ein Firewallprogramm blockiert, das auf Ihrem Computer ausgeführt wird.
  • Die Kommunikation mit dem emulierten Gerät wird möglicherweise von einer anderen (physischen) Firewall oder einem Router blockiert, mit dem Ihr Computer verbunden ist.

Der virtuelle Router des Emulators sollte alle ausgehenden TCP- und UDP-Verbindungen und ‑Nachrichten im Namen des emulierten Geräts verarbeiten können, sofern die Netzwerkumgebung Ihres Entwicklungscomputers dies zulässt. Es gibt keine integrierten Einschränkungen für Portnummern oder ‑bereiche, sondern nur die Einschränkungen, die durch das Betriebssystem und das Netzwerk Ihres Hosts auferlegt werden.

Je nach Umgebung unterstützt der Emulator möglicherweise keine anderen Protokolle (z. B. ICMP, das für „ping“ verwendet wird). Derzeit werden IGMP und Multicast vom Emulator nicht unterstützt.

Netzwerkumleitung verwenden

Wenn Sie mit einer Emulatorinstanz kommunizieren möchten, die sich hinter dem virtuellen Router befindet, richten Sie die Netzwerkumleitung auf dem virtuellen Router ein. Clients können dann eine Verbindung zu einem angegebenen Gastport auf dem Router herstellen, während der Router den Traffic von und zu diesem Port an den Hostport des emulierten Geräts weiterleitet.

Um die Netzwerkumleitung einzurichten, erstellen Sie eine Zuordnung von Host- und Gastports und ‑adressen in der Emulatorinstanz. Es gibt zwei Möglichkeiten, die Netzwerkumleitung einzurichten: mit Emulator-Konsolenbefehlen und mit dem Android Debug Bridge-Tool (adb), wie in den folgenden Abschnitten beschrieben.

Weiterleitung über die Emulatorkonsole einrichten

Jede Emulatorinstanz bietet eine Steuerkonsole, mit der Sie eine Verbindung herstellen und Befehle ausgeben können, die für diese Instanz spezifisch sind. Verwenden Sie den Konsolenbefehl redir, um die Weiterleitung nach Bedarf für eine Emulatorinstanz einzurichten.

Ermitteln Sie zuerst die Konsolenportnummer für die Ziel-Emulatorinstanz. Die Konsolenportnummer für die erste gestartete Emulatorinstanz ist beispielsweise 5554. Stellen Sie als Nächstes eine Verbindung zur Konsole der Ziel-Emulatorinstanz her und geben Sie die zugehörige Konsolenportnummer an:

telnet localhost 5554

Sobald die Verbindung hergestellt ist, müssen Sie sich authentifizieren, bevor Sie die Weiterleitung einrichten können. Weitere Informationen dazu finden Sie unter Konsolensitzung starten und beenden. Nach der Authentifizierung können Sie mit dem Befehl redir die Weiterleitung bearbeiten.

So fügen Sie eine Weiterleitung hinzu:

redir add <protocol>:<host-port>:<guest-port>

Dabei ist <protocol> entweder tcp oder udp. <host-port> und <guest-port> legen die Zuordnung zwischen Ihrem Computer und dem emulierten System fest.

Mit dem folgenden Befehl wird beispielsweise eine Weiterleitung eingerichtet, die alle eingehenden TCP-Verbindungen zu Ihrem Hostcomputer (Entwicklung) auf 127.0.0.1:5000 verarbeitet und an das emulierte System auf 10.0.2.15:6000 weiterleitet:

redir add tcp:5000:6000

Verwenden Sie den Befehl redir del, um eine Weiterleitung zu löschen. Mit redir list können Sie alle Weiterleitungen für eine bestimmte Instanz auflisten. Weitere Informationen zu diesen und anderen Konsolenbefehlen finden Sie unter Emulator-Konsolenbefehle senden.

Beachten Sie, dass Portnummern durch Ihre lokale Umgebung eingeschränkt sind. Das bedeutet in der Regel, dass Sie Host-Portnummern unter 1024 nur mit speziellen Administratorberechtigungen verwenden können. Außerdem können Sie keine Weiterleitung für einen Hostport einrichten, der bereits von einem anderen Prozess auf Ihrem Computer verwendet wird. In diesem Fall wird von redir eine entsprechende Fehlermeldung generiert.

Weiterleitung über adb einrichten

Das Tool Android Debug Bridge (adb) bietet Portweiterleitung als alternative Möglichkeit zum Einrichten der Netzwerkumleitung. Weitere Informationen finden Sie in der Dokumentation zu adb unter Portweiterleitung einrichten.

Derzeit gibt es in adb keine Möglichkeit, eine Weiterleitung zu entfernen, außer durch das Beenden des adb-Servers.

DNS-Einstellungen des Emulators konfigurieren

Beim Start liest der Emulator die Liste der DNS-Server, die Ihr System derzeit verwendet. Anschließend werden die IP-Adressen von bis zu vier Servern in dieser Liste gespeichert und bei Bedarf Aliase für die emulierten Adressen 10.0.2.3, 10.0.2.4, 10.0.2.5 und 10.0.2.6 eingerichtet.

Unter Linux und macOS ruft der Emulator die DNS-Serveradressen ab, indem er die Datei /etc/resolv.conf parst. Unter Windows ruft der Emulator die Adressen durch Aufrufen der GetNetworkParams()-API ab. Das bedeutet in der Regel, dass der Emulator den Inhalt der Datei „hosts“ (/etc/hosts unter Linux/macOS, %WINDOWS%/system32/HOSTS unter Windows) ignoriert.

Wenn Sie den Emulator über die Befehlszeile starten, können Sie mit der Option -dns-server <serverList> die Adressen der zu verwendenden DNS-Server manuell angeben. Dabei ist <serverList> eine durch Kommas getrennte Liste von Servernamen oder IP-Adressen. Diese Option kann hilfreich sein, wenn Sie im emulierten Netzwerk Probleme mit der DNS-Auflösung haben, z. B. wenn beim Verwenden des Webbrowsers die Meldung „Unbekannter Host“ angezeigt wird.

Emulator mit einem Proxy verwenden

In vielen Unternehmensnetzwerken werden direkte Verbindungen zum Internet von Netzwerkadministratoren abgelehnt. Stattdessen müssen Internetverbindungen über einen bestimmten Proxy erfolgen. Wenn Sie in einem Netzwerk mit Proxyanforderung auf das Internet zugreifen möchten, muss der Emulator wissen, dass ein Proxy vorhanden ist und dass er sich damit verbinden muss.

Aufgrund der Funktionsweise von HTTP führen eine direkte Webserververbindung und eine Verbindung über einen Proxy zu unterschiedlichen GET-Anfragen. Der Emulator schreibt die GET-Anfragen vom virtuellen Gerät transparent um, bevor er mit dem Proxy kommuniziert.

Wenn Ihr Emulator über einen Proxyserver auf das Internet zugreifen muss, können Sie einen benutzerdefinierten HTTP-Proxy konfigurieren.

Wenn Sie den Emulator in Android Studio verwenden, können Sie einen Proxy über die Einstellungen im Android Studio-Menü (Settings > Appearance & Behavior > System Settings > HTTP Proxy) konfigurieren. Weitere Informationen finden Sie in der Android Studio-Dokumentation unter Android Studio-Proxy einrichten.

Wenn Sie den Emulator als eigenständige Anwendung (außerhalb von Android Studio) verwenden, können Sie einen Proxy über den Bildschirm Erweiterte Steuerelemente des Emulators konfigurieren:

  1. Klicken Sie bei geöffnetem Emulator auf Mehr .
  2. Klicken Sie auf Einstellungen und Proxy (nur verfügbar, wenn der Emulator nicht über Android Studio gestartet wurde).
  3. Legen Sie die HTTP-Proxy-Einstellungen fest.

Alternativ können Sie einen Proxy über die Befehlszeile mit der Option -http-proxy <proxy> konfigurieren, wenn Sie den Emulator starten. Geben Sie in diesem Fall die Proxy-Informationen in <proxy> in einem der folgenden Formate an:

http://<machineName>:<port>

oder

http://<username>:<password>@<machineName>:<port>

Mit der Option -http-proxy wird der Emulator gezwungen, den angegebenen HTTP- oder HTTPS-Proxy für alle ausgehenden TCP-Verbindungen zu verwenden. Die Weiterleitung für UDP wird nicht unterstützt.

Alternativ können Sie die Umgebungsvariable http_proxy mit dem Wert definieren, den Sie für <proxy> verwenden möchten. In diesem Fall müssen Sie keinen Wert für <proxy> im Befehl -http-proxy angeben. Der Emulator prüft beim Start den Wert der Umgebungsvariable http_proxy und verwendet ihn automatisch, sofern er definiert ist.

Mit der Option -debug-proxy können Sie Probleme mit Proxyverbindungen diagnostizieren.

Emulatorinstanzen verbinden

Wenn Sie möchten, dass eine Emulatorinstanz mit einer anderen kommuniziert, richten Sie die Netzwerkumleitung wie unten beschrieben ein.

Angenommen, Ihre Umgebung wird so dargestellt:

  • A ist Ihr Entwicklungscomputer.
  • B ist Ihre erste Emulatorinstanz, die auf A ausgeführt wird.
  • C ist Ihre zweite Emulatorinstanz, die ebenfalls auf A ausgeführt wird.

Wenn Sie einen Server auf B ausführen möchten, mit dem C eine Verbindung herstellt, gehen Sie so vor:

  1. Richten Sie den Server auf B ein, der 10.0.2.15:<serverPort> überwacht.
  2. Richten Sie auf der B-Konsole eine Weiterleitung von A:localhost:<localPort> zu B:10.0.2.15:<serverPort> ein.
  3. Auf C soll der Client eine Verbindung zu 10.0.2.2:<localPort> herstellen.

Wenn Sie beispielsweise einen HTTP-Server ausführen möchten, wählen Sie <serverPort> als 80 und <localPort> als 8080 aus:

  • B überwacht 10.0.2.15:80.
  • Geben Sie auf der B-Konsole redir add tcp:8080:80. ein.
  • C stellt eine Verbindung zu 10.0.2.2:8080 her.

Sprachanruf oder SMS an eine andere Emulatorinstanz senden

Der Emulator leitet simulierte Sprachanrufe und SMS-Nachrichten automatisch von einer Instanz an eine andere weiter. Wenn Sie einen Sprachanruf oder eine SMS senden möchten, verwenden Sie die Dialer App bzw. die SMS App in einem der Emulatoren.

So starten Sie einen simulierten Sprachanruf an eine andere Emulatorinstanz:

  1. Starten Sie die Telefon App auf der ursprünglichen Emulatorinstanz.
  2. Geben Sie als zu wählende Nummer die Konsolenportnummer der Zielinstanz ein.

    Sie können die Konsolenportnummer der Zielinstanz anhand des Fenstertitels ermitteln, wenn sie in einem separaten Fenster ausgeführt wird, nicht jedoch, wenn sie in einem Toolfenster ausgeführt wird. Die Konsolenportnummer wird als „Android Emulator (<port>)“ gemeldet.

    Alternativ können Sie mit dem Befehl adb devices eine Liste der aktiven virtuellen Geräte und ihrer Konsolenportnummern ausgeben lassen. Weitere Informationen finden Sie unter Geräte abfragen.

  3. Klicken Sie auf die Wähltaste. Ein neuer eingehender Anruf wird in der Ziel-Emulatorinstanz angezeigt.

So senden Sie eine SMS-Nachricht an eine andere Emulatorinstanz:

  1. Öffne die SMS-App, falls verfügbar.
  2. Geben Sie die Konsolenportnummer der Ziel-Emulatorinstanz als SMS-Adresse an.
  3. Geben Sie den Nachrichtentext ein.
  4. Senden Sie die Nachricht. Die Nachricht wird an die Ziel-Emulatorinstanz gesendet.

Sie können auch eine Verbindung zu einer Emulatorkonsole herstellen, um einen eingehenden Sprachanruf oder eine SMS zu simulieren. Weitere Informationen finden Sie unter Telefonie-Emulation und SMS-Emulation.