Configura la rete di Android Emulator

L'emulatore offre funzionalità di networking versatili che puoi utilizzare per configurare ambienti di modellazione e test complessi per la tua app. Questa pagina illustra l'architettura e le funzionalità di rete dell'emulatore.

Spazio di indirizzi di rete

Ogni istanza dell'emulatore viene eseguita dietro un router virtuale o un servizio firewall che lo isola dalle interfacce e dalle impostazioni di rete della macchina di sviluppo e da internet. Un dispositivo emulato non è in grado di rilevare la tua macchina di sviluppo o altre istanze dell'emulatore sulla rete. Rileva solo che è connesso tramite Ethernet a un router o a un firewall.

Il router virtuale per ogni istanza gestisce lo spazio di indirizzi di rete 10.0.2/24. Tutti gli indirizzi gestiti dal router sono nel formato 10.0.2.xx, dove xx è un numero. Gli indirizzi all'interno di questo spazio sono preallocati dall'emulatore o dal router come segue:

Indirizzo di rete Descrizione
10.0.2.1 Indirizzo del router o del gateway
10.0.2.2 Alias speciale per l'interfaccia di loopback host (127.0.0.1 sulla macchina di sviluppo)
10.0.2.3 Primo server DNS
10.0.2.4 / 10.0.2.5 / 10.0.2.6 Secondo, terzo e quarto server DNS facoltativi
10.0.2.15 La rete del dispositivo emulato quando è connesso tramite Ethernet
10.0.2.16 La rete del dispositivo emulato quando il dispositivo è connesso tramite Wi-Fi
127.0.0.1 L'interfaccia di loopback del dispositivo emulato

Le stesse assegnazioni di indirizzi vengono utilizzate da tutte le istanze dell'emulatore in esecuzione. Ciò significa che se due istanze sono in esecuzione contemporaneamente sulla tua macchina, ognuna avrà il proprio router, seguita da un indirizzo IP 10.0.2.15. Le istanze sono isolate da un router e non possono rilevarsi a vicenda sulla stessa rete. Per informazioni su come consentire alle istanze dell'emulatore di comunicare tramite TCP/UDP, consulta la sezione sull'interconnessione delle istanze dell'emulatore.

L'indirizzo 127.0.0.1 sulla tua macchina di sviluppo corrisponde all'interfaccia di loopback dell'emulatore. Per accedere ai servizi in esecuzione sull'interfaccia di loopback della macchina di sviluppo, utilizza invece l'indirizzo speciale 10.0.2.2.

Gli indirizzi preallocati di un dispositivo emulato sono specifici dell'emulatore Android e probabilmente sono molto diversi sui dispositivi reali (che probabilmente sono anche la traduzione dell'indirizzo di rete, in particolare dietro un router o un firewall).

Limitazioni della rete locale

Le app Android eseguite su un emulatore possono connettersi alla rete disponibile sulla tua workstation. Tuttavia, le app si connettono tramite l'emulatore, non direttamente all'hardware, e l'emulatore funziona come una normale app sulla workstation. Ciò può causare alcune limitazioni:

  • La comunicazione con il dispositivo emulato potrebbe essere bloccata da un programma firewall in esecuzione sulla tua macchina.
  • La comunicazione con il dispositivo emulato potrebbe essere bloccata da un altro firewall o router (fisico) a cui è connessa la tua macchina.

Il router virtuale dell'emulatore dovrebbe essere in grado di gestire tutte le connessioni TCP e UDP in uscita e i messaggi per conto del dispositivo emulato, a condizione che l'ambiente di rete della macchina di sviluppo lo consenta. Non esistono limitazioni integrate per i numeri di porta o gli intervalli, solo per quelli imposti dal sistema operativo host e dalla rete.

A seconda dell'ambiente, l'emulatore potrebbe non supportare altri protocolli (ad esempio ICMP, utilizzato per il "ping"). Attualmente, l'emulatore non supporta IGMP o multicast.

Usa reindirizzamento di rete

Per comunicare con un'istanza di emulatore dietro il router virtuale, configura il reindirizzamento di rete sul router virtuale. I client possono quindi connettersi a una porta ospite specificata sul router, mentre il router indirizza il traffico da e verso la porta host del dispositivo emulato.

Per configurare il reindirizzamento di rete, crea una mappatura delle porte e degli indirizzi host e guest sull'istanza dell'emulatore. Esistono due modi per configurare il reindirizzamento di rete: utilizzando i comandi della console dell'emulatore e lo strumento Android Debug Bridge (adb), come descritto nelle sezioni seguenti.

Configura il reindirizzamento tramite la console emulatore

Ogni istanza dell'emulatore fornisce una console di controllo a cui puoi connetterti ed emettere comandi specifici per l'istanza. Usa il comando della console redir per configurare il reindirizzamento in base alle esigenze di un'istanza dell'emulatore.

Innanzitutto, determina il numero di porta della console per l'istanza dell'emulatore di destinazione. Ad esempio, il numero di porta della console per la prima istanza dell'emulatore avviata è 5554. Quindi, collegati alla console dell'istanza dell'emulatore di destinazione, specificando il numero di porta della console, come segue:

telnet localhost 5554

Dopo la connessione, devi eseguire l'autenticazione prima di poter configurare il reindirizzamento. Per maggiori dettagli su come eseguire questa operazione, consulta Avviare e interrompere una sessione della console. Dopo l'autenticazione, usa il comando redir per lavorare con il reindirizzamento.

Per aggiungere un reindirizzamento, utilizza:

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

Dove <protocol> è tcp o udp e <host-port> e <guest-port> impostano la mappatura tra la tua macchina e il sistema emulato.

Ad esempio, il seguente comando imposta un reindirizzamento che gestisce tutte le connessioni TCP in entrata alla tua macchina host (di sviluppo) su 127.0.0.1:5000 e le passa al sistema emulato il giorno 10.0.2.15:6000:

redir add tcp:5000:6000

Per eliminare un reindirizzamento, usa il comando redir del. Per elencare tutti i reindirizzamenti per un'istanza specifica, utilizza redir list. Per maggiori informazioni su questi e altri comandi della console, vedi Inviare comandi della console di Emulator.

Tieni presente che i numeri di porta sono limitati dal tuo ambiente locale. In genere, ciò significa che non è possibile utilizzare i numeri di porta host inferiori a 1024 senza privilegi amministrativi speciali. Inoltre, non potrai configurare un reindirizzamento per una porta host che è già utilizzata da un altro processo sulla tua macchina. In questo caso, redir genera un messaggio di errore in tal caso.

Configura il reindirizzamento tramite ADB

Lo strumento Android Debug Bridge (adb) fornisce il port forwarding, un modo alternativo per configurare il reindirizzamento di rete. Per ulteriori informazioni, consulta Configurare il port forwarding nella documentazione di adb.

Tieni presente che al momento adb non offre un modo per rimuovere un reindirizzamento, se non nell'arresto del server adb.

Configura le impostazioni DNS dell'emulatore

All'avvio, l'emulatore legge l'elenco dei server DNS attualmente in uso nel sistema. Quindi memorizza gli indirizzi IP di un massimo di quattro server in questo elenco e configura gli alias sugli indirizzi emulati 10.0.2.3, 10.0.2.4, 10.0.2.5 e 10.0.2.6, in base alle esigenze.

Su Linux e macOS, l'emulatore ottiene gli indirizzi dei server DNS analizzando il file /etc/resolv.conf. Su Windows, l'emulatore ottiene gli indirizzi chiamando l'API GetNetworkParams(). Tieni presente che di solito significa che l'emulatore ignora i contenuti del file "hosts" (/etc/hosts su Linux/macOS, %WINDOWS%/system32/HOSTS su Windows).

Quando avvii l'emulatore dalla riga di comando, puoi utilizzare l'opzione -dns-server <serverList> per specificare manualmente gli indirizzi dei server DNS da utilizzare, dove <serverList> è un elenco separato da virgole di nomi di server o indirizzi IP. Questa opzione potrebbe essere utile se riscontri problemi di risoluzione DNS nella rete emulata (ad esempio, viene visualizzato il messaggio "Errore host sconosciuto" quando utilizzi il browser web).

Usare l'emulatore con un proxy

Su molte reti aziendali, le connessioni dirette a internet vengono rifiutate dagli amministratori di rete. Le connessioni internet devono invece passare tramite un proxy specifico. Per accedere a internet su una rete con un requisito di proxy, l'emulatore deve sapere che è presente un proxy e che deve connettersi a questo proxy.

A causa della natura del protocollo HTTP, una connessione diretta al server web e una connessione attraverso un proxy generano richieste GET diverse. L'emulatore riscrive in modo trasparente le richieste GET del dispositivo virtuale prima di comunicare con il proxy.

Se l'emulatore deve accedere a internet tramite un server proxy, puoi configurare un proxy HTTP personalizzato dalla schermata Controlli estesi dell'emulatore:

  1. Con l'emulatore aperto, fai clic su Altro .
  2. Fai clic su Impostazioni e Proxy.
  3. Definisci le impostazioni del proxy HTTP.

In alternativa, puoi configurare un proxy dalla riga di comando con l'opzione -http-proxy <proxy> quando avvii l'emulatore. In questo caso, specifica le informazioni proxy in <proxy> in uno di questi formati:

http://<machineName>:<port>

oppure

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

L'opzione -http-proxy impone all'emulatore di utilizzare il proxy HTTP o HTTPS specificato per tutte le connessioni TCP in uscita. Il reindirizzamento per UDP non è supportato.

In alternativa, puoi definire la variabile di ambiente http_proxy con il valore che vuoi utilizzare per <proxy>. In questo caso, non è necessario specificare un valore per <proxy> nel comando -http-proxy: l'emulatore controlla il valore della variabile di ambiente http_proxy all'avvio e utilizza automaticamente il relativo valore, se definito.

Puoi utilizzare l'opzione -debug-proxy per diagnosticare i problemi di connessione proxy.

Istanze emulatore di interconnessione

Per consentire a un'istanza di un emulatore di comunicare con un'altra, configura il reindirizzamento di rete come descritto di seguito.

Supponiamo che il tuo ambiente sia rappresentato come segue:

  • A è la tua macchina di sviluppo.
  • B è la tua prima istanza di emulatore, in esecuzione su A.
  • C è la tua seconda istanza di emulatore, anch'essa in esecuzione su A.

Se vuoi eseguire un server su B a cui si connetterà C, configuralo nel seguente modo:

  1. Configura il server su B, ascoltando 10.0.2.15:<serverPort>.
  2. Nella console B, configura un reindirizzamento da A:localhost:<localPort> a B:10.0.2.15:<serverPort>.
  3. Su C, fai in modo che il client si connetta a 10.0.2.2:<localPort>.

Ad esempio, se vuoi eseguire un server HTTP, seleziona <serverPort> come 80 e <localPort> come 8080:

  • B ascolta su 10.0.2.15:80.
  • Nella console B, invia il problema redir add tcp:8080:80.
  • C si connette a 10.0.2.2:8080.

Invia una chiamata o un SMS a un'altra istanza dell'emulatore

L'emulatore inoltra automaticamente chiamate vocali e SMS simulati da un'istanza all'altra. Per inviare una chiamata o un SMS, utilizza rispettivamente l'app Telefono o l'app per SMS da uno degli emulatori.

Per avviare una chiamata vocale simulata a un'altra istanza di emulatore:

  1. Avvia l'app Telefono sull'istanza dell'emulatore di origine.
  2. Come numero da comporre, inserisci il numero di porta della console dell'istanza di destinazione.

    Puoi determinare il numero di porta della console dell'istanza di destinazione controllando il titolo della finestra, se è in esecuzione in una finestra separata, ma non se è in esecuzione in una finestra degli strumenti. Il numero di porta della console è riportato come "Android Emulator (<porta>)".

    In alternativa, il comando adb devices stampa un elenco dei dispositivi virtuali in esecuzione e dei relativi numeri di porta della console. Per ulteriori informazioni, consulta la sezione Query per i dispositivi.

  3. Fai clic sul pulsante di composizione. Nell'istanza dell'emulatore di destinazione viene visualizzata una nuova chiamata in entrata.

Per inviare un messaggio SMS a un'altra istanza dell'emulatore:

  1. Avvia l'app per SMS, se disponibile.
  2. Specifica come indirizzo SMS il numero di porta della console dell'istanza dell'emulatore di destinazione.
  3. Inserisci il testo del messaggio.
  4. Invia il messaggio. Il messaggio viene recapitato all'istanza dell'emulatore di destinazione.
  5. Puoi anche connetterti a una console di emulatore per simulare una chiamata vocale o un SMS in arrivo. Per maggiori informazioni, consulta Emulazione della telefonia ed Emulazione SMS.