Configurar a rede do Android Emulator

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 do dispositivo emulado quando conectado usando Ethernet
10.0.2.16 A rede do dispositivo emulado quando conectado 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:

  1. Com o emulador aberto, clique em More .
  2. Clique em Settings e Proxy.
  3. 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:

  1. Configure o servidor em B, detectando 10.0.2.15:<serverPort>.
  2. No console de B, configure um redirecionamento de A:localhost:<localPort> para B:10.0.2.15:<serverPort>.
  3. 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:

  1. Inicie o app de telefone na instância de emulador de origem.
  2. 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.

  3. 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:

  1. Inicie o app de SMS, se disponível.
  2. Especifique o número da porta do console da instância de emulador de destino como o endereço SMS.
  3. Digite o texto da mensagem.
  4. Envie a mensagem. A mensagem é entregue para a instância de emulador de destino.
  5. 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.