O emulador oferece recursos de rede versáteis que você pode usar para configurar ambientes complexos de modelagem e teste para seu app. Esta página apresenta a arquitetura de rede e os recursos do emulador.
Espaço do endereço de rede
Cada instância do emulador é executada por trás de um serviço de roteador ou firewall virtual que o isola das interfaces e configurações de rede da máquina de desenvolvimento e da Internet. Um dispositivo emulado não pode detectar sua máquina de desenvolvimento ou outras instâncias de emulador na rede. Ele detecta apenas que está conectado por Ethernet a um roteador ou firewall.
O roteador virtual de cada instância gerencia o espaço de endereço de rede 10.0.2/24. Todos os endereços gerenciados pelo roteador estão no formato 10.0.2.xx, em que xx é um número. Os endereços dentro desse espaço são pré-alocados pelo emulador ou roteador da seguinte maneira:
Endereço de rede | Descrição |
---|---|
10.0.2.1 | Endereço do roteador ou gateway |
10.0.2.2 | Alias especial para a interface de loopback do host (127.0.0.1 na sua máquina de desenvolvimento) |
10.0.2.3 | Primeiro servidor DNS |
10.0.2.4 / 10.0.2.5 / 10.0.2.6 | Segundo, terceiro e quarto servidores DNS opcionais |
10.0.2.15 | A rede de dispositivos emulados quando conectados usando Ethernet |
10.0.2.16 | A rede de dispositivos emulados quando conectados por Wi-Fi |
127.0.0.1 | Interface de loopback do dispositivo emulado |
As mesmas atribuições de endereço são usadas por todas as instâncias do emulador em execução. Isso significa que, se você tiver duas instâncias em execução ao mesmo tempo na máquina, cada uma delas terá o próprio roteador e, por trás disso, cada uma terá um endereço IP igual a 10.0.2.15. As instâncias são isoladas por um roteador e não podem se detectar na mesma rede. Para informações sobre como permitir que as instâncias do emulador se comuniquem via TCP/UDP, consulte a seção sobre como interconectar instâncias do emulador.
O endereço 127.0.0.1 na sua máquina de desenvolvimento corresponde à interface de loopback do emulador. Para acessar serviços em execução na interface de loopback da máquina de desenvolvimento, use o endereço especial 10.0.2.2.
Os endereços pré-alocados de um dispositivo emulado são específicos ao Android Emulator e, provavelmente, são muito diferentes em dispositivos reais. Dispositivos reais provavelmente são convertidos em endereços de rede, especificamente por trás de um roteador ou firewall.
Limitações da rede local
Apps Android em execução em um emulador podem se conectar à rede disponível na sua estação de trabalho. No entanto, os apps se conectam por meio do emulador, não diretamente ao hardware, e o emulador atua como um app normal na estação de trabalho. Isso pode causar algumas limitações:
- A comunicação com o dispositivo emulado pode ser bloqueada por um programa de firewall executado na máquina.
- A comunicação com o dispositivo emulado pode ser bloqueada por outro firewall ou roteador (físico) em que a máquina esteja conectada.
O roteador virtual do emulador precisa processar todas as conexões e mensagens de TCP e UDP de saída em nome do dispositivo emulado, desde que o ambiente de rede da máquina de desenvolvimento permita. Não há limitações integradas para números ou intervalos de portas, apenas aquelas impostas pelo sistema operacional e pela rede do host.
Dependendo do ambiente, o emulador pode não oferecer suporte para outros protocolos (como ICMP, usado para "ping"). Atualmente, o emulador não oferece suporte para IGMP nem multicast.
Usar o redirecionamento de rede
Para se comunicar com uma instância de emulador por trás do roteador virtual, configure o redirecionamento de rede no roteador virtual. Os clientes podem se conectar a uma porta de convidado especificada no roteador, enquanto o roteador direciona o tráfego de e para essa porta e para a porta do host do dispositivo emulado.
Para configurar o redirecionamento de rede, crie um mapeamento de portas e endereços
de host e convidado na instância de emulador. Há duas maneiras de configurar
o redirecionamento de rede: usando os comandos do console do emulador e a ferramenta Android
Debug Bridge (adb
), conforme descrito nas seções a seguir.
Configurar o redirecionamento pelo console do emulator
Cada instância do emulador oferece um console de controle a que você pode se conectar e
emitir comandos específicos para essa instância. Use o
comando redir
do console para configurar o redirecionamento conforme necessário para uma
instância de emulador.
Primeiro, determine o número da porta do console para a instância de emulador de destino. Por exemplo, o número da porta do console para a primeira instância do emulador iniciada é 5554. Em seguida, conecte-se ao console da instância de emulador de destino, especificando o número de porta do console, da seguinte maneira:
telnet localhost 5554
Após a conexão, faça a autenticação antes de configurar o redirecionamento. Consulte
Iniciar e interromper uma sessão de console para
saber, em detalhes, como fazer isso. Depois da autenticação, use o comando redir
para trabalhar com
o redirecionamento.
Para adicionar um redirecionamento, use:
redir add <protocol>:<host-port>:<guest-port>
Em que <protocol>
é tcp
ou udp
,
e <host-port>
e <guest-port>
definem o
mapeamento entre sua máquina e o sistema emulado.
Por exemplo, o comando a seguir configura um redirecionamento que processa todas as conexões TCP de entrada para sua máquina host (desenvolvimento) em 127.0.0.1:5000 e as transmite para o sistema emulado em 10.0.2.15:6000:
redir add tcp:5000:6000
Para excluir um redirecionamento, use o comando redir del
. Para
listar todos os redirecionamentos de uma instância específica, use redir
list
. Para mais informações sobre esses e outros comandos do console, consulte
Enviar comandos do console do emulador.
Os números de porta são restringidos pelo ambiente local. Normalmente, isso significa que não é possível usar números de porta do host abaixo de 1024 sem ter privilégios especiais de administrador. Além disso, não será possível configurar um redirecionamento para uma porta do host que já esteja sendo usada por outro processo na máquina. Nesse caso, redir
gera uma mensagem de erro.
Configurar o redirecionamento pelo adb
A ferramenta Android Debug Bridge (adb
) oferece o encaminhamento de portas, uma maneira alternativa de configurar o redirecionamento de rede. Para mais informações, consulte Configurar o encaminhamento de portas
na documentação do adb
.
No momento, o adb
não oferece uma maneira de remover um redirecionamento,
a não ser com a interrupção do servidor adb
.
Definir as configurações de DNS do emulador
Na inicialização, o emulador lê a lista de servidores DNS que o sistema está usando no momento. Em seguida, ele armazena os endereços IP de até quatro servidores nessa lista e configura aliases para eles nos endereços emulados 10.0.2.3, 10.0.2.4, 10.0.2.5 e 10.0.2.6, conforme necessário.
No Linux e no macOS, o emulador extrai os endereços do servidor DNS analisando
o arquivo /etc/resolv.conf
. No Windows, o emulador extrai os endereços chamando a API GetNetworkParams()
. Normalmente, isso
significa que o emulador ignora o conteúdo do arquivo "hosts"
(/etc/hosts
no Linux/macOS, %WINDOWS%/system32/HOSTS
no Windows).
Ao iniciar o emulador na linha de comando, você pode usar a opção
-dns-server <serverList>
para especificar manualmente os
endereços dos servidores DNS, em que <serverList>
é uma lista
separada por vírgulas de nomes de servidores ou endereços IP. Essa opção poderá ser útil se você
encontrar problemas de resolução de DNS na rede emulada. Por exemplo, quando uma mensagem
"Unknown Host error" for mostrada ao usar o navegador da Web.
Usar o emulador com um proxy
Em muitas redes corporativas, conexões diretas com a Internet são recusadas pelos administradores da rede. Em vez disso, as conexões de Internet precisam passar por um proxy específico. Para acessar a Internet em uma rede com um requisito de proxy, o emulador precisa saber se há um proxy e se conectar a ele.
Devido à natureza do HTTP, uma conexão direta com o servidor da Web e uma conexão por um proxy resultam em solicitações GET diferentes. O emulador reescreve de maneira transparente as solicitações GET do dispositivo virtual antes de se comunicar com o proxy para que ele funcione.
Se o emulador precisar acessar a Internet por um servidor proxy, você poderá configurar um proxy HTTP personalizado na tela Extended controls do emulador:
- Com o emulador aberto, clique em More .
- Clique em Settings e Proxy.
- Defina as configurações de proxy HTTP.
Como alternativa, é possível configurar um proxy a partir da linha de comando com a opção -http-proxy <proxy>
ao iniciar o emulador.
Nesse caso, você especifica as informações do proxy
em <proxy>
em um destes formatos:
http://<machineName>:<port>
ou
http://<username>:<password>@<machineName>:<port>
A opção -http-proxy
força o emulador a usar o proxy HTTP ou HTTPS
especificado para todas as conexões TCP de saída. Não há suporte ao redirecionamento
para UDP.
Como alternativa, você pode definir a variável de ambiente
http_proxy
para o valor que quer usar para
<proxy>
. Nesse caso, não é necessário especificar um valor para <proxy>
no comando -http-proxy
: o
emulador verifica o valor da variável de ambiente http_proxy
na
inicialização e o utiliza automaticamente, se definido.
Você pode usar a opção -debug-proxy
para diagnosticar problemas de conexão de proxy.
Interconectar instâncias de emulador
Para permitir que uma instância do emulador se comunique com outra, configure o redirecionamento de rede conforme descrito a seguir.
Suponha que o ambiente seja representado da seguinte maneira:
- A: sua máquina de desenvolvimento.
- B: sua primeira instância de emulador, em execução em A.
- C: sua segunda instância de emulador, também em execução em A.
Se você quiser executar um servidor em B, a que C vai se conectar, configure-o da seguinte maneira:
- Configure o servidor em B, detectando 10.0.2.15:<serverPort>.
- No console B, configure um redirecionamento de A:localhost:<localPort> para B:10.0.2.15:<serverPort>.
- Em C, faça o cliente se conectar a 10.0.2.2:<localPort>.
Por exemplo, se você quiser executar um servidor HTTP, selecione
<serverPort>
como 80 e <localPort>
como
8080:
- B detecta em 10.0.2.15:80.
- No console B, emita
redir add tcp:8080:80.
- C é conectado a 10.0.2.2:8080.
Enviar uma ligação ou um SMS para outra instância de emulador
O emulador encaminha automaticamente chamadas de voz e mensagens SMS simuladas de uma instância a outra. Para enviar uma ligação ou SMS, use o app de telefone ou de mensagem de texto, respectivamente, a partir de um dos emuladores.
Para iniciar uma ligação simulada para outra instância de emulador:
- Inicie o app de telefone na instância de emulador de origem.
Como o número a ser discado, digite o número da porta do console da instância de destino.
Para determinar o número da porta do console da instância de destino, verifique o título da janela, se ela estiver sendo executada em uma janela separada, mas não se estiver em uma janela de ferramentas. O número da porta do console é informado como "Android Emulator (<port>)".
Além disso, o comando
adb devices
mostra uma lista de dispositivos virtuais em execução e os números de porta de console. Para mais informações, leia Consultar dispositivos.- Clique no botão de discagem. Uma nova chamada de entrada aparece na instância de emulador de destino.
Para enviar uma mensagem SMS para outra instância de emulador:
- Inicie o app de SMS, se disponível.
- Especifique o número da porta do console da instância de emulador de destino como o endereço SMS.
- Digite o texto da mensagem.
- Envie a mensagem. A mensagem é entregue para a instância de emulador de destino.
Você também pode se conectar a um console do emulador para simular o recebimento de uma ligação ou de um SMS. Para mais informações, consulte Emulação de telefonia e Emulação de SMS.