L'emulatore offre funzionalità di rete versatili che puoi utilizzare per configurare ambienti di test e modellazione complessi per la tua app. Questa pagina introduce l'architettura e le funzionalità di rete dell'emulatore.
Spazio degli indirizzi di rete
Ogni istanza dell'emulatore viene eseguita dietro un router virtuale o un servizio firewall che la isola dalle interfacce e dalle impostazioni di rete della macchina di sviluppo e da internet. Un dispositivo emulato non può rilevare la macchina di sviluppo o altre istanze dell'emulatore sulla rete. Rileva solo che è collegato tramite Ethernet a un router o 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 preassegnati dall'emulatore o dal router nel seguente modo:
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 | (Facoltativo) Secondo, terzo e quarto server DNS |
10.0.2.15 | La rete del dispositivo emulato quando è connesso tramite Ethernet |
10.0.2.16 | La rete del dispositivo emulato quando è connesso tramite Wi-Fi |
127.0.0.1 | L'interfaccia di loopback del dispositivo emulato |
Tutte le istanze dell'emulatore in esecuzione utilizzano le stesse assegnazioni di indirizzi. Ciò significa che se hai due istanze in esecuzione contemporaneamente sulla tua macchina, ognuna avrà il proprio router e, dietro, ognuna avrà 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 relativa all'interconnessione delle istanze dell'emulatore.
L'indirizzo 127.0.0.1 sul computer 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 preassegnati di un dispositivo emulato sono specifici dell'emulatore Android e probabilmente molto diversi sui dispositivi reali (che probabilmente sono anche tradotti in indirizzi di rete, in particolare dietro un router o un firewall).
Limitazioni del networking locale
Le app per Android in esecuzione 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 si comporta 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 sul tuo computer.
- 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 e i messaggi TCP e UDP in uscita 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 o gli intervalli di porte, ma solo quelle imposte dal sistema operativo host e dalla rete.
A seconda dell'ambiente, l'emulatore potrebbe non essere in grado di supportare altri protocolli (come ICMP, utilizzato per "ping"). Al momento, l'emulatore non supporta IGMP o multicast.
Utilizzare il reindirizzamento di rete
Per comunicare con un'istanza dell'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 quella porta alla porta host del dispositivo emulato.
Per configurare il reindirizzamento della rete, crea una mappatura di porte e indirizzi host e guest
nell'istanza dell'emulatore. Esistono due modi per configurare
il reindirizzamento di rete: utilizzando i comandi della console dell'emulatore e utilizzando lo strumento Android
Debug Bridge (adb
), come descritto nelle sezioni seguenti.
Configurare il reindirizzamento tramite la console dell'emulatore
Ogni istanza dell'emulatore fornisce una console di controllo a cui puoi connetterti ed
emettere comandi specifici per quell'istanza. Utilizza 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. Successivamente, connettiti alla console dell'istanza dell'emulatore di destinazione, specificando il numero di porta della console, come segue:
telnet localhost 5554
Una volta connesso, devi eseguire l'autenticazione prima di poter configurare il reindirizzamento. Per
informazioni dettagliate su come eseguire questa operazione, vedi
Avviare e interrompere una sessione della console. Una volta autenticato, utilizza 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
il mapping tra la tua macchina e il sistema emulato.
Ad esempio, il seguente comando configura un reindirizzamento che gestisce tutte le connessioni TCP in entrata alla tua macchina host (sviluppo) su 127.0.0.1:5000 e le trasmette al sistema emulato su 10.0.2.15:6000:
redir add tcp:5000:6000
Per eliminare un reindirizzamento, utilizza il comando redir del
. Per
elencare tutti i reindirizzamenti per un'istanza specifica, utilizza redir
list
. Per ulteriori informazioni su questi e altri comandi della console, vedi
Inviare comandi della console dell'emulatore.
Tieni presente che i numeri di porta sono limitati dall'ambiente locale. In genere
significa che non puoi utilizzare numeri di porta host inferiori a 1024 senza privilegi di amministratore
speciali. Inoltre, non potrai configurare un reindirizzamento per una porta host già in uso da un altro processo sulla tua macchina. In questo caso, redir
genera un messaggio di errore in tal senso.
Configurare il reindirizzamento tramite ADB
Lo strumento Android Debug Bridge (adb
) fornisce l'inoltro delle porte, un modo alternativo
per configurare il reindirizzamento di rete. Per saperne di più, 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 arrestando il server adb
.
Configurare le impostazioni DNS dell'emulatore
All'avvio, l'emulatore legge l'elenco dei server DNS attualmente utilizzati dal sistema. Quindi memorizza gli indirizzi IP di un massimo di quattro server in questo elenco e configura gli alias per questi server sugli indirizzi emulati 10.0.2.3, 10.0.2.4, 10.0.2.5 e 10.0.2.6, in base alle necessità.
Su Linux e macOS, l'emulatore ottiene gli indirizzi del server DNS analizzando
il file /etc/resolv.conf
. Su Windows, l'emulatore ottiene gli
indirizzi chiamando l'API GetNetworkParams()
. Tieni presente che in genere ciò 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
di nomi di server o indirizzi IP separati da virgole. Questa opzione potrebbe essere utile se riscontri problemi di risoluzione DNS nella rete emulata (ad esempio, un messaggio di errore "Host sconosciuto" visualizzato quando utilizzi il browser web).
Utilizzare l'emulatore con un proxy
In molte reti aziendali, le connessioni dirette a internet vengono rifiutate dagli amministratori di rete. Le connessioni a internet devono invece passare attraverso un proxy specifico. Per accedere a internet su una rete con un requisito proxy, l'emulatore deve sapere che esiste un proxy e che deve connettersi.
A causa della natura di HTTP, una connessione diretta al server web e una connessione tramite un proxy generano richieste GET diverse. L'emulatore riscrive in modo trasparente le richieste GET dal dispositivo virtuale prima di comunicare con il proxy, in modo che funzioni.
Se l'emulatore deve accedere a internet tramite un server proxy, puoi configurare un proxy HTTP personalizzato.
Quando utilizzi l'emulatore in Android Studio, puoi configurare un proxy con le impostazioni nel menu di Android Studio (Settings > Appearance & Behavior > System Settings > HTTP Proxy
). Puoi trovare maggiori dettagli in Configurare il proxy di Android Studio nella documentazione di Android Studio
.
Quando utilizzi l'emulatore come applicazione autonoma (al di fuori di Android Studio), puoi configurare un proxy dalla schermata Controlli estesi dell'emulatore:
- Con l'emulatore aperto, fai clic su Altro
.
- Fai clic su Impostazioni e Proxy (disponibile solo se l'emulatore non è stato avviato da Android Studio).
- 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 sul proxy
in <proxy>
in uno di questi formati:
http://<machineName>:<port>
o
http://<username>:<password>@<machineName>:<port>
L'opzione -http-proxy
forza l'emulatore a 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 lo utilizza automaticamente, se è definito.
Puoi utilizzare l'opzione -debug-proxy
per diagnosticare i problemi di connessione proxy.
Istanze dell'emulatore Interconnect
Per consentire a un'istanza dell'emulatore di comunicare con un'altra, configura il reindirizzamento di rete come descritto di seguito.
Supponiamo che il tuo ambiente sia rappresentato nel seguente modo:
- A è la tua macchina di sviluppo.
- B è la tua prima istanza dell'emulatore, in esecuzione su A.
- C è la seconda istanza dell'emulatore, in esecuzione anche su A.
Se vuoi eseguire un server su B a cui si connetterà C, configuralo nel seguente modo:
- Configura il server su B, in ascolto su 10.0.2.15:<serverPort>.
- Nella console B, configura un reindirizzamento da A:localhost:<localPort> a B:10.0.2.15:<serverPort>.
- 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.
- Sulla console B, esegui
redir add tcp:8080:80.
- C si connette a 10.0.2.2:8080.
Inviare una chiamata vocale o un SMS a un'altra istanza dell'emulatore
L'emulatore inoltra automaticamente le chiamate vocali e i messaggi SMS simulati da un'istanza a un'altra. Per inviare una chiamata vocale o un SMS, utilizza rispettivamente l'app Telefono o l'app SMS da uno degli emulatori.
Per avviare una chiamata vocale simulata a un'altra istanza dell'emulatore:
- Avvia l'app Telefono sull'istanza dell'emulatore di origine.
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 viene segnalato come "Emulatore Android (<porta>)".
In alternativa, il comando
adb devices
stampa un elenco di dispositivi virtuali in esecuzione e dei relativi numeri di porta della console. Per maggiori informazioni, consulta la sezione Query per dispositivi.- Fai clic sul pulsante di composizione. Nella nuova istanza dell'emulatore di destinazione viene visualizzata una nuova chiamata in entrata.
Per inviare un messaggio SMS a un'altra istanza dell'emulatore:
- Avvia l'app di messaggistica, se disponibile.
- Specifica il numero di porta della console dell'istanza dell'emulatore di destinazione come indirizzo SMS.
- Inserisci il testo del messaggio.
- Invia il messaggio. Il messaggio viene recapitato all'istanza dell'emulatore di destinazione.
Puoi anche connetterti a una console dell'emulatore per simulare una chiamata vocale o un SMS in arrivo. Per saperne di più, consulta Emulazione di telefonia ed Emulazione di SMS.