Konfigurowanie sieci emulatora Androida

Emulator zapewnia wszechstronne funkcje sieciowe, które pozwalają skonfigurować złożone środowiska modelowania i testowania aplikacji. Na tej stronie omawiamy architekturę i możliwości sieci emulatora.

Przestrzeń adresowa sieci

Każda instancja emulatora działa za routerem wirtualnym lub usługą zapory sieciowej, która izoluje ją od interfejsów i ustawień sieci maszyny programistycznej oraz od internetu. Emulowane urządzenie nie może wykryć maszyny programistycznej ani innych instancji emulatora w sieci. Wykrywa tylko, że urządzenie jest połączone z routerem lub zaporą sieciową kablem Ethernet.

Router wirtualny każdej instancji zarządza sieciową przestrzenią adresową 10.0.2/24. Wszystkie adresy zarządzane przez router mają postać 10.0.2.xx, gdzie xx to liczba. Adresy w tym obszarze 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 loopback hosta (127.0.0.1 na komputerze programisty).
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 Emulowana sieć urządzenia przy połączeniu przez Ethernet
2.10.10.2016 Emulowana sieć urządzenia po połączeniu przez Wi-Fi
127.0.0.1 Emulowany interfejs loopback urządzenia

Te same przypisania adresów są używane we wszystkich uruchomionych instancjach emulatora. To oznacza, że jeśli na maszynie działają 2 instancje jednocześnie, każda z nich będzie miała własny router, a za nią każda będzie miała adres IP 10.0.2.15. Instancje są izolowane przez router i nie mogą się nawzajem wykrywać w tej samej sieci. Informacje o tym, jak zezwolić instancjom emulatora na komunikację przez TCP/UDP, znajdziesz w sekcji poświęconej instancjom emulatora połączeń międzysieciowych.

Adres 127.0.0.1 na maszynie do programowania odpowiada interfejsowi loopback emulatora. Aby uzyskać dostęp do usług działających w interfejsie loopback maszyny programistycznej, użyj specjalnego adresu 10.0.2.2.

Wstępnie przydzielone adresy emulowanego urządzenia są specyficzne dla emulatora Androida i na rzeczywistych urządzeniach prawdopodobnie będą się bardzo różnić od adresów sieciowych (które najprawdopodobniej będą również przetłumaczone jako adresy sieciowe, zwłaszcza 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. Ten emulator działa na stacji roboczej jak zwykła aplikacja. Może to powodować pewne ograniczenia:

  • Komunikację z emulowanym urządzeniem może blokować program zapory sieciowej uruchomiony na komputerze.
  • Komunikacja z emulowanym urządzeniem może być blokowana przez inną (fizyczną) zaporę sieciową lub router, do których jest podłączony Twój komputer.

Router wirtualny emulatora powinien obsługiwać wszystkie wychodzące połączenia i wiadomości TCP i UDP w imieniu emulowanego urządzenia, o ile pozwala na to środowisko sieciowe maszyny programistycznej. Nie ma wbudowanych ograniczeń numerów portów ani ich zakresów. Jedynie te ograniczenia są nakładane przez system operacyjny hosta i sieć.

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

Użyj przekierowania sieci

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

Aby skonfigurować przekierowanie sieci, utwórz mapowanie portów hosta i gościa oraz adresów w instancji emulatora. Przekierowywanie sieci można skonfigurować na 2 sposoby: za pomocą poleceń konsoli emulatora oraz narzędzia Android Debug Bridge (adb) zgodnie z opisem w kolejnych sekcjach.

Konfigurowanie przekierowania w konsoli emulatora

Każda instancja emulatora udostępnia konsolę sterowania, z którą możesz się połączyć i wydawać do niej specjalne polecenia. Aby skonfigurować przekierowanie w razie potrzeby dla instancji emulatora, użyj polecenia w konsoli redir.

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

telnet localhost 5554

Po nawiązaniu połączenia musisz uwierzytelnić się, aby skonfigurować przekierowanie. Więcej informacji o tym, jak to zrobić, znajdziesz w artykule Rozpoczynanie 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> i <guest-port> ustawia mapowanie między maszyną a emulowanym systemem.

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

redir add tcp:5000:6000

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

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

Konfigurowanie przekierowania przez adb

Narzędzie Android Debug Bridge (adb) udostępnia przekierowanie portów – alternatywny sposób konfigurowania przekierowania sieci. Więcej informacji znajdziesz w artykule o konfigurowaniu przekierowania portów w dokumentacji adb.

Pamiętaj, że adb obecnie nie umożliwia usunięcia przekierowania przez zatrzymanie serwera adb.

Skonfiguruj ustawienia DNS emulatora

Podczas uruchamiania emulator odczytuje listę serwerów DNS, których obecnie używa Twój system. Następnie przechowuje na tej liście adresy IP maksymalnie 4 serwerów i w razie potrzeby konfiguruje dla nich aliasy w 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 przez analizę pliku /etc/resolv.conf. W systemie Windows emulator uzyskuje adresy przez wywołanie interfejsu API GetNetworkParams(). Pamiętaj, że zwykle oznacza to, że emulator ignoruje zawartość pliku „hosts” (/etc/hosts w systemie Linux/macOS, %WINDOWS%/system32/HOSTS w systemie Windows).

Gdy uruchamiasz emulator z poziomu wiersza poleceń, możesz użyć opcji -dns-server <serverList>, by ręcznie określić adresy serwerów DNS, które mają być używane. <serverList> to lista nazw serwerów lub adresów IP rozdzielonych przecinkami. Ta opcja może być przydatna, jeśli w emulowanej sieci wystąpią problemy z rozpoznawaniem nazw DNS (np. komunikat „Błąd nieznanego hosta”, który pojawia się podczas korzystania z przeglądarki).

Używanie emulatora z serwerem proxy

W wielu sieciach firmowych administratorzy sieci odrzucają bezpośrednie połączenia z internetem. Połączenie z internetem musi przechodzić przez określony serwer proxy. Aby uzyskać dostęp do internetu w sieci z wymaganiami dotyczącymi serwera proxy, emulator musi wiedzieć, że istnieje serwer proxy i że musi się z nim połączyć.

Ze względu na charakter protokołu HTTP bezpośrednie połączenie z serwerem WWW i połączenie przez serwer proxy powodują różne żądania GET. Emulator w przejrzysty sposób przepisuje żądania GET z urządzenia wirtualnego przed komunikacją z serwerem proxy, aby wszystko działało.

Jeśli emulator musi połączyć się z internetem przez serwer proxy, na ekranie rozszerzonych ustawień możesz skonfigurować niestandardowy serwer proxy HTTP:

  1. W otwartym emulatorze kliknij Więcej .
  2. Kliknij kolejno Ustawienia i Serwer proxy.
  3. Określ ustawienia serwera proxy HTTP.

Serwer proxy możesz też skonfigurować z poziomu wiersza poleceń, używając 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życie przez emulatora określonego serwera proxy HTTP lub HTTPS we wszystkich wychodzących połączeniach TCP. Przekierowania UDP nie są obsługiwane.

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

Opcja -debug-proxy pozwala zdiagnozować problemy z połączeniem z serwerem proxy.

Instancje emulatora połączenia międzysieciowego

Aby umożliwić komunikację jednej instancji emulatora z inną, skonfiguruj przekierowanie sieci w opisany poniżej sposób.

Załóżmy, że Twoje środowisko jest przedstawione w ten sposób:

  • A to maszyna do programowania.
  • B to Twoja pierwsza instancja emulatora uruchomiona na komórce A.
  • C to Twoja druga instancja emulatora, również uruchomiona w środowisku A.

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

  1. Skonfiguruj serwer w stacji B, nasłuchując 10.0.2.15:<serverPort>.
  2. W konsoli B skonfiguruj przekierowanie z A:localhost:<localPort> do B:10.0.2.15:<serverPort>.
  3. W przeglądarce C poproś klienta, aby połączył się z siecią 10.0.2.2:<localPort>.

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

  • B odsłuchuje 10.0.2.15:80.
  • W konsoli B wyślij numer redir add tcp:8080:80.
  • C łączy się z numerem 10.0.2.2:8080.

Wysyłanie połączenia głosowego lub SMS-a 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 telefonu lub aplikacji do obsługi SMS-ów z jednego z emulatorów.

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

  1. Uruchom aplikację telefonu w źródłowej instancji emulatora.
  2. Jako numer telefonu wpisz numer portu konsoli instancji docelowej.

    Numer portu konsoli instancji docelowej możesz określić, sprawdzając tytuł jej okna, jeśli jest ona uruchomiona w osobnym oknie, ale nie wtedy, gdy działa w oknie narzędzia. Numer portu konsoli jest raportowany jako „Emulator Androida (<port>)”.

    Polecenie adb devices też wyświetla listę uruchomionych urządzeń wirtualnych wraz z numerami portów konsoli. Więcej informacji znajdziesz w artykule Wysyłanie zapytań o urządzenia.

  3. Kliknij przycisk wybierania numeru. W docelowej instancji emulatora 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ść jest dostarczana do docelowej instancji emulatora.
  5. 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 opisach Emulacja telefonii i Emulacja SMS-ów.