Android Emulator-Netzwerk einrichten

Der Emulator bietet vielseitige Netzwerkfunktionen, mit denen Sie komplexe Modellierungs- und Testumgebungen für Ihre Anwendung 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 einem Firewalldienst ausgeführt, der sie von den Netzwerkschnittstellen und Einstellungen der Entwicklungsmaschine sowie vom Internet isoliert. Ein emuliertes Gerät kann Ihre Entwicklungsmaschine oder andere Emulatorinstanzen im Netzwerk nicht erkennen. Es erkennt nur, dass es über das Ethernet mit einem Router oder einer Firewall verbunden ist.

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

Netzwerkadresse Beschreibung
10.0.2.1 Router- oder Gateway-Adresse
10.0.2.2 Spezieller Alias für Ihre Host-Loopback-Schnittstelle (127.0.0.1 auf Ihrer Entwicklungsmaschine)
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 emulierte Gerätenetzwerk bei einer Ethernetverbindung
10.0.2.16 Das emulierte Gerätenetzwerk bei Verbindung über WLAN
127.0.0.1 Die emulierte Loopback-Schnittstelle des Geräts

Von allen ausgeführten Emulatorinstanzen werden dieselben Adresszuweisungen verwendet. Wenn also zwei Instanzen gleichzeitig auf Ihrem Computer ausgeführt werden, hat jede einen eigenen Router, der dahinter die IP-Adresse 10.0.2.15 hat. 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 zum Verbinden von Emulatorinstanzen.

Die Adresse 127.0.0.1 auf Ihrem Entwicklungscomputer entspricht der Loopback-Schnittstelle des Emulators. Für den Zugriff auf Dienste, die auf der Loopback-Schnittstelle des Entwicklungsrechners ausgeführt werden, verwenden Sie stattdessen die Sonderadresse 10.0.2.2.

Die vorab zugewiesenen Adressen eines emulierten Geräts sind spezifisch für den Android-Emulator und unterscheiden sich wahrscheinlich stark auf echten Geräten, für die wahrscheinlich auch Netzwerkadressen ü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 sich mit dem auf Ihrer Workstation verfügbaren Netzwerk verbinden. Anwendungen stellen jedoch über den Emulator und nicht direkt eine Verbindung zur Hardware her. Der Emulator funktioniert wie eine normale Anwendung auf Ihrer Workstation. Dies kann zu einigen Einschränkungen führen:

  • Die Kommunikation mit dem emulierten Gerät wird möglicherweise durch ein auf Ihrem Computer ausgeführtes Firewallprogramm blockiert.
  • Die Kommunikation mit dem emulierten Gerät kann durch eine andere (physische) Firewall oder einen anderen Router blockiert werden, 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 Entwicklungsmaschinen dies zulässt. Es gibt keine integrierten Beschränkungen für Portnummern oder -bereiche, sondern nur für die, die von Ihrem Hostbetriebssystem und Netzwerk auferlegt werden.

Je nach Umgebung unterstützt der Emulator möglicherweise keine anderen Protokolle (z. B. ICMP, das für das „Pingen“) verwendet wird. Derzeit unterstützt der Emulator weder IGMP noch Multicast.

Netzwerkweiterleitung verwenden

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

Erstellen Sie zum Einrichten der Netzwerkweiterleitung eine Zuordnung der Ports und Adressen von Host und Gast auf der Emulatorinstanz. Es gibt zwei Möglichkeiten, die Netzwerkweiterleitung einzurichten: mithilfe der Emulator-Konsolenbefehle und mit dem Android Debug Bridge-Tool (adb), wie in den folgenden Abschnitten beschrieben.

Weiterleitung über die Emulatorkonsole einrichten

Jede Emulatorinstanz stellt eine Steuerkonsole bereit, zu der Sie eine Verbindung herstellen und für diese Instanz spezifische Befehle ausgeben können. Verwenden Sie den Konsolenbefehl redir, um die Weiterleitung nach Bedarf für eine Emulatorinstanz einzurichten.

Ermitteln Sie zuerst die Konsolen-Portnummer für die Zielemulatorinstanz. Beispiel: Die Portnummer der Konsole für die erste gestartete Emulatorinstanz lautet 5554. Stellen Sie als Nächstes eine Verbindung zur Konsole der Zielemulatorinstanz her. Geben Sie dabei die Konsolen-Portnummer wie folgt an:

telnet localhost 5554

Nach der Verbindung 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 verwenden Sie den Befehl redir, um mit der Weiterleitung zu arbeiten.

So fügen Sie eine Weiterleitung hinzu:

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

Dabei ist <protocol> entweder tcp oder udp und <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 Host-Computer (Entwicklungscomputer) unter 127.0.0.1:5000 verarbeitet und an das emulierte System am 10.0.2.15:6000 übergibt:

redir add tcp:5000:6000

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

Beachten Sie, dass Portnummern durch Ihre lokale Umgebung eingeschränkt sind. Dies bedeutet in der Regel, dass Sie Host-Portnummern unter 1024 ohne spezielle Administratorberechtigungen nicht 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 gibt redir eine entsprechende Fehlermeldung aus.

Weiterleitung über ADB einrichten

Das Android Debug Bridge-Tool (adb) bietet eine Portweiterleitung, eine alternative Möglichkeit, die Netzwerkweiterleitung einzurichten. Weitere Informationen finden Sie unter Portweiterleitung einrichten in der adb-Dokumentation.

Beachten Sie, dass adb derzeit keine Möglichkeit bietet, eine Weiterleitung zu entfernen, es sei denn, Sie beenden den adb-Server.

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 je nach Bedarf Aliasse 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 erhält der Emulator die Adressen des DNS-Servers durch Parsen der Datei /etc/resolv.conf. Unter Windows ruft der Emulator die Adressen durch Aufrufen der GetNetworkParams() API ab. Dies bedeutet in der Regel, dass der Emulator den Inhalt der „Hosts“-Datei ignoriert (/etc/hosts unter Linux/macOS, %WINDOWS%/system32/HOSTS unter Windows).

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. <serverList> ist dabei eine durch Kommas getrennte Liste von Servernamen oder IP-Adressen. Diese Option kann nützlich sein, wenn im emulierten Netzwerk Probleme mit der DNS-Auflösung auftreten (z. B. die Meldung „Unbekannter Host“, die im Webbrowser angezeigt wird).

Emulator mit Proxy verwenden

In vielen Unternehmensnetzwerken werden direkte Verbindungen zum Internet von Netzwerkadministratoren abgelehnt. Stattdessen müssen Internetverbindungen über einen bestimmten Proxy geleitet werden. Für den Zugriff auf das Internet in einem Netzwerk mit einer Proxyanforderung muss der Emulator wissen, dass es einen Proxy gibt und dass er eine Verbindung dazu herstellen muss.

Aufgrund der Beschaffenheit 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 neu, bevor er mit dem Proxy kommuniziert, damit es funktioniert.

Wenn der Emulator über einen Proxyserver auf das Internet zugreifen muss, können Sie über den Bildschirm Erweiterte Steuerelemente des Emulators einen benutzerdefinierten HTTP-Proxy konfigurieren:

  1. Klicken Sie bei geöffnetem Emulator auf Mehr .
  2. Klicken Sie auf Einstellungen und Proxy.
  3. Legen Sie Ihre 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 Proxy-Informationen in <proxy> in einem der folgenden Formate an:

http://<machineName>:<port>

oder

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

Die Option -http-proxy zwingt den Emulator, 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 im Befehl -http-proxy keinen Wert für <proxy> angeben. Der Emulator prüft den Wert der Umgebungsvariablen http_proxy beim Start und verwendet ihn automatisch, sofern definiert.

Mit der Option -debug-proxy können Sie Proxy-Verbindungsprobleme diagnostizieren.

Interconnect-Emulatorinstanzen

Damit eine Emulatorinstanz mit einer anderen kommunizieren kann, richten Sie wie unten beschrieben die Netzwerkumleitung ein.

Angenommen, Ihre Umgebung wird so dargestellt:

  • A ist Ihre Entwicklungsmaschine.
  • 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, zu dem C eine Verbindung herstellt, richten Sie ihn so ein:

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

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

  • B hört am 10.0.2.15:80 zu.
  • Führen Sie in der B-Konsole den Fehler redir add tcp:8080:80. aus.
  • 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. Verwenden Sie zum Senden eines Sprachanrufs oder einer SMS die Telefon-App bzw. SMS-App von einem der Emulatoren.

So initiieren 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, sofern sie in einem separaten Fenster ausgeführt wird, nicht aber, wenn sie in einem Toolfenster ausgeführt wird. Die Portnummer der Konsole wird als „Android-Emulator (<port>)“ gemeldet.

    Alternativ gibt der Befehl adb devices eine Liste der ausgeführten virtuellen Geräte und der zugehörigen Konsolenportnummern aus. Weitere Informationen findest du unter Geräteabfrage.

  3. Klicken Sie auf die Telefonschaltfläche. In der Zielemulatorinstanz wird ein neuer eingehender Anruf angezeigt.

So senden Sie eine SMS an eine andere Emulatorinstanz:

  1. Starten Sie die SMS-App, falls verfügbar.
  2. Geben Sie die Konsolenportnummer der Zielemulatorinstanz als SMS-Adresse an.
  3. Geben Sie den Nachrichtentext ein.
  4. Senden Sie die Nachricht. Die Nachricht wird an die Zielemulatorinstanz zugestellt.
  5. Du kannst auch eine Verbindung zu einer Emulatorkonsole herstellen, um einen eingehenden Sprachanruf oder eine eingehende SMS zu simulieren. Weitere Informationen finden Sie unter Telefonieemulation und SMS-Emulation.