Konfigurowanie sieci emulatora Androida

Emulator zapewnia wszechstronne funkcje sieciowe, których możesz używać do konfigurowania złożonych środowisk modelowania i testowania aplikacji. Na tej stronie znajdziesz informacje o architekturze i możliwościach sieci emulatora.

Przestrzeń adresowa sieci

Każda instancja emulatora działa za wirtualnym routerem lub zaporą sieciową, która izoluje ją od interfejsów sieciowych i ustawień komputera deweloperskiego oraz od internetu. Emulowane urządzenie nie może wykryć komputera deweloperskiego ani innych instancji emulatora w sieci. Wykrywa tylko, że jest połączony przez Ethernet z routerem lub zaporą sieciową.

Wirtualny router każdej instancji zarządza przestrzenią adresów sieciowych 10.0.2/24. Wszystkie adresy zarządzane przez router mają postać 10.0.2.xx, gdzie xx to liczba. Adresy w tej przestrzeni są wstępnie przydzielane przez emulator lub router w ten sposób:

Adres sieciowy Opis
10.0.2.1 Adres routera lub bramy
10.0.2.2 Specjalny alias interfejsu zwrotnego hosta (127.0.0.1 na komputerze deweloperskim)
10.0.2.3 Pierwszy serwer DNS
10.0.2.4 / 10.0.2.5 / 10.0.2.6 Opcjonalne drugi, trzeci i czwarty serwer DNS
10.0.2.15 Sieć emulowanego urządzenia po połączeniu za pomocą Ethernetu
10.0.2.16 Sieć emulowanego urządzenia po połączeniu przez Wi-Fi
127.0.0.1 Interfejs pętli zwrotnej emulowanego urządzenia

Wszystkie uruchomione instancje emulatora używają tych samych przypisań adresów. Oznacza to, że jeśli na Twoim komputerze działają jednocześnie 2 instancje, każda z nich będzie miała własny router, a za nim adres IP 10.0.2.15. Instancje są od siebie odizolowane przez router i nie mogą się wykrywać w tej samej sieci. Informacje o tym, jak umożliwić instancjom emulatora komunikację za pomocą protokołów TCP/UDP, znajdziesz w sekcji dotyczącej wzajemnego łączenia instancji emulatora.

Adres 127.0.0.1 na komputerze deweloperskim odpowiada interfejsowi zwrotnemu emulatora. Aby uzyskać dostęp do usług działających na interfejsie zwrotnym maszyny deweloperskiej, użyj specjalnego adresu 10.0.2.2.

Wstępnie przydzielone adresy emulowanego urządzenia są specyficzne dla emulatora Androida i prawdopodobnie będą się znacznie różnić od adresów na prawdziwych urządzeniach (które prawdopodobnie będą też miały adresy sieciowe przetłumaczone, w szczególności za routerem lub zaporą sieciową).

Ograniczenia sieci lokalnej

Aplikacje na Androida działające na emulatorze mogą łączyć się z siecią dostępną na stacji roboczej. Aplikacje łączą się jednak przez emulator, a nie bezpośrednio ze sprzętem, a emulator działa na stacji roboczej jak zwykła aplikacja. Może to powodować pewne ograniczenia:

  • Komunikacja z emulowanym urządzeniem może być blokowana przez zaporę sieciową działającą na Twoim komputerze.
  • Komunikacja z emulowanym urządzeniem może być blokowana przez inną (fizyczną) zaporę sieciową lub router, do którego podłączony jest Twój komputer.

Wirtualny router emulatora powinien obsługiwać wszystkie połączenia i wiadomości wychodzące TCP i UDP w imieniu emulowanego urządzenia, o ile środowisko sieciowe komputera deweloperskiego na to pozwala. Nie ma wbudowanych ograniczeń dotyczących numerów ani zakresów portów, tylko te narzucone przez system operacyjny hosta i sieć.

W zależności od środowiska emulator może nie obsługiwać innych protokołów (np. ICMP używanego do polecenia „ping”). Obecnie emulator nie obsługuje protokołu IGMP ani multiemisji.

Korzystanie z przekierowania sieciowego

Aby komunikować się z instancją emulatora za wirtualnym routerem, skonfiguruj przekierowanie sieciowe na wirtualnym routerze. Klienty mogą się wtedy łączyć z określonym portem gościa na routerze, a router kieruje ruch do i z tego portu do portu hosta emulowanego urządzenia.

Aby skonfigurować przekierowanie sieci, utwórz mapowanie portów i adresów hosta i gościa na instancji emulatora. Przekierowanie sieciowe można skonfigurować na 2 sposoby: za pomocą poleceń konsoli emulatora i za pomocą narzędzia Android Debug Bridge (adb), jak opisano w sekcjach poniżej.

Konfigurowanie przekierowania za pomocą konsoli emulatora

Każda instancja emulatora ma konsolę sterowania, z którą możesz się połączyć i wydawać polecenia specyficzne dla tej instancji. Użyj polecenia konsoli redir, aby skonfigurować przekierowanie zgodnie z potrzebami instancji emulatora.

Najpierw określ numer portu konsoli dla docelowej instancji emulatora. Na przykład numer portu konsoli pierwszej uruchomionej instancji emulatora to 5554. Następnie połącz się z konsolą docelowej instancji emulatora, podając jej numer portu konsoli w ten sposób:

telnet localhost 5554

Po nawiązaniu połączenia musisz się uwierzytelnić, zanim skonfigurujesz przekierowanie. Szczegółowe informacje o tym, jak to zrobić, znajdziesz w artykule Uruchamianie i zatrzymywanie sesji konsoli. Po uwierzytelnieniu użyj polecenia redir, aby pracować z przekierowaniem.

Aby dodać przekierowanie, użyj:

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

gdzie <protocol> to tcp lub udp, a <host-port><guest-port> określają mapowanie między maszyną a emulowanym systemem.

Na przykład to polecenie konfiguruje przekierowanie, które obsługuje wszystkie przychodzące połączenia TCP z komputerem hosta (programisty) na adresie 127.0.0.1:5000 i przekazuje je do emulowanego systemu na adresie 10.0.2.15:6000:

redir add tcp:5000:6000

Aby usunąć przekierowanie, użyj polecenia redir del. Aby wyświetlić listę wszystkich przekierowań dla konkretnej instancji, użyj polecenia redir list. Więcej informacji o tych i innych poleceniach konsoli znajdziesz w artykule Wysyłanie poleceń konsoli emulatora.

Pamiętaj, że numery portów są ograniczone przez środowisko lokalne. Zwykle oznacza to, że nie możesz używać numerów portów hosta poniżej 1024 bez specjalnych uprawnień administratora. Nie możesz też skonfigurować przekierowania dla portu hosta, który jest już używany przez inny proces na Twoim komputerze. W takim przypadku redir generuje komunikat o błędzie.

Konfigurowanie przekierowania za pomocą adb

Narzędzie Android Debug Bridge (adb) umożliwia przekierowywanie portów, co jest alternatywnym sposobem konfigurowania przekierowania sieciowego. Więcej informacji znajdziesz w artykule Konfigurowanie przekierowania portów w adbdokumentacji.

Pamiętaj, że adb nie oferuje obecnie możliwości usunięcia przekierowania, z wyjątkiem zatrzymania serwera adb.

Konfigurowanie ustawień DNS emulatora

Podczas uruchamiania emulator odczytuje listę serwerów DNS, z których korzysta obecnie Twój system. Następnie zapisuje adresy IP maksymalnie 4 serwerów na tej liście i w razie potrzeby konfiguruje dla nich aliasy na emulowanych adresach 10.0.2.3, 10.0.2.4, 10.0.2.5 i 10.0.2.6.

W systemach Linux i macOS emulator uzyskuje adresy serwerów DNS, analizując plik /etc/resolv.conf. W systemie Windows emulator uzyskuje adresy, wywołując interfejs GetNetworkParams() API. Pamiętaj, że zwykle oznacza to, że emulator ignoruje zawartość pliku „hosts” (/etc/hosts w systemach Linux i macOS, %WINDOWS%/system32/HOSTS w systemie Windows).

Podczas uruchamiania emulatora z wiersza poleceń możesz użyć opcji -dns-server <serverList>, aby ręcznie określić adresy serwerów DNS, które mają być używane. W tym przypadku <serverList> to lista nazw serwerów lub adresów IP oddzielonych przecinkami. Ta opcja może być przydatna, jeśli w emulowanej sieci występują problemy z rozpoznawaniem nazw DNS (np. podczas korzystania z przeglądarki internetowej pojawia się komunikat „Nieznany host”).

Korzystanie z emulatora z serwerem proxy

W wielu sieciach firmowych administratorzy sieci odmawiają bezpośrednich połączeń z internetem. Zamiast tego połączenia internetowe muszą przechodzić przez określony serwer proxy. Aby uzyskać dostęp do internetu w sieci, która wymaga serwera proxy, emulator musi wiedzieć, że taki serwer istnieje i że musi się z nim połączyć.

Ze względu na charakter protokołu HTTP bezpośrednie połączenie z serwerem internetowym i połączenie przez serwer proxy powodują wysyłanie różnych żądań GET. Emulator w sposób niewidoczny dla użytkownika przepisuje żądania GET z urządzenia wirtualnego, zanim połączy się z serwerem proxy, aby wszystko działało prawidłowo.

Jeśli emulator musi uzyskiwać dostęp do internetu przez serwer proxy, możesz skonfigurować niestandardowy serwer proxy HTTP.

Jeśli używasz emulatora w Android Studio, możesz skonfigurować serwer proxy w ustawieniach w menu Android Studio (Settings > Appearance & Behavior > System Settings > HTTP Proxy). Więcej informacji znajdziesz w artykule Konfigurowanie serwera proxy w Android Studio w dokumentacji Android Studio.

Jeśli używasz emulatora jako samodzielnego narzędzia (poza Androidem Studio), możesz skonfigurować serwer proxy na ekranie Ustawienia zaawansowane emulatora:

  1. Po otwarciu emulatora kliknij Więcej .
  2. Kliknij UstawieniaProxy (dostępne tylko wtedy, gdy emulator nie został uruchomiony z Android Studio).
  3. Określ ustawienia serwera proxy HTTP.

Możesz też skonfigurować serwer proxy z poziomu wiersza poleceń za pomocą opcji -http-proxy <proxy> podczas uruchamiania emulatora. W takim przypadku podaj informacje o serwerze proxy w <proxy> w jednym z tych formatów:

http://<machineName>:<port>

lub

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

Opcja -http-proxy wymusza używanie przez emulator określonego serwera proxy HTTP lub HTTPS w przypadku wszystkich wychodzących połączeń TCP. Przekierowanie w przypadku protokołu UDP nie jest obsługiwane.

Możesz też zdefiniować zmienną środowiskową http_proxy z wartością, której chcesz użyć w przypadku <proxy>. W tym przypadku nie musisz określać wartości parametru <proxy> w poleceniu -http-proxy – emulator sprawdza wartość zmiennej środowiskowej http_proxy podczas uruchamiania i automatycznie używa jej wartości, jeśli jest zdefiniowana.

Możesz użyć opcji -debug-proxy, aby zdiagnozować problemy z połączeniem proxy.

Instancje emulatora połączenia międzysieciowego

Aby umożliwić komunikację między instancjami emulatora, skonfiguruj przekierowanie sieciowe zgodnie z opisem poniżej.

Załóżmy, że Twoje środowisko wygląda tak:

  • A to komputer używany do programowania.
  • B to pierwsza instancja emulatora działająca na A.
  • C to druga instancja emulatora, która również działa na urządzeniu A.

Jeśli chcesz uruchomić na komputerze B serwer, z którym połączy się komputer C, skonfiguruj go w ten sposób:

  1. Skonfiguruj serwer na komputerze B, aby nasłuchiwał na adresie 10.0.2.15:<serverPort>.
  2. Na konsoli B skonfiguruj przekierowanie z A:localhost:<localPort> na B:10.0.2.15:<serverPort>.
  3. Na komputerze C połącz klienta z adresem 10.0.2.2:<localPort>.

Jeśli na przykład chcesz uruchomić serwer HTTP, wybierz <serverPort> jako 80 i <localPort> jako 8080:

  • B nasłuchuje na 10.0.2.15:80.
  • W konsoli B wpisz redir add tcp:8080:80.
  • C łączy się z adresem 10.0.2.2:8080.

Wysyłanie połączeń głosowych i SMS-ów do innej instancji emulatora

Emulator automatycznie przekazuje symulowane połączenia głosowe i SMS-y z jednej instancji do drugiej. Aby wysłać połączenie głosowe lub SMS-a, użyj odpowiednio aplikacji Telefon lub SMS-ów na jednym z emulatorów.

Aby zainicjować symulowane połączenie głosowe z inną instancją emulatora:

  1. Uruchom aplikację Telefon na instancji emulatora, z której pochodzi połączenie.
  2. Jako numer do wybrania wpisz numer portu konsoli instancji docelowej.

    Numer portu konsoli docelowej instancji możesz sprawdzić w tytule okna, jeśli jest ono uruchomione w osobnym oknie, ale nie w przypadku, gdy jest uruchomione w oknie narzędziowym. Numer portu konsoli jest podawany jako „Emulator Androida (<port>)”.

    Alternatywnie polecenie adb devices wyświetla listę uruchomionych urządzeń wirtualnych i numery portów konsoli. Więcej informacji znajdziesz w artykule Wysyłanie zapytań o urządzenia.

  3. Kliknij przycisk wybierania. W instancji emulatora docelowego pojawi się nowe połączenie przychodzące.

Aby wysłać SMS-a do innej instancji emulatora:

  1. Uruchom aplikację SMS, jeśli jest dostępna.
  2. Podaj numer portu konsoli docelowej instancji emulatora jako adres SMS.
  3. Wpisz tekst wiadomości.
  4. Wyślij wiadomość. Wiadomość zostanie dostarczona do docelowej instancji emulatora.

Możesz też połączyć się z konsolą emulatora, aby symulować przychodzące połączenie głosowe lub SMS-a. Więcej informacji znajdziesz w sekcjach Emulacja telefoniiEmulacja SMS-ów.