Configurar a rede do Android Emulator

O emulador fornece recursos de rede versáteis que você pode usar para configurar ambientes de teste e modelagem complexos para seu app. As seções a seguir apresentam a arquitetura e os recursos da rede do emulador.

Espaço do endereço de rede

Cada instância do emulador é executada por trás de um serviço de roteador/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 ver sua máquina de desenvolvimento ou outras instâncias de emulador na rede. Em vez disso, ele vê apenas que está conectado por meio da Ethernet a um roteador/firewall.

O roteador virtual de cada instância gerencia o espaço do endereço de rede 10.0.2/24. Todos os endereços gerenciados pelo roteador estão na forma 10.0.2.xx, em que xx é um número. Os endereços dentro desse espaço são pré-alocados pelo emulador/roteador da seguinte maneira:

Endereço de rede Descrição
10.0.2.1 Endereço do roteador/gateway
10.0.2.2 Alias especial para a interface de loopback do host (ou seja, 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 servidor DNS opcional (se houver)
10.0.2.15 Interface de rede/Ethernet do dispositivo emulado
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 em execução no emulador. 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 ver na mesma rede. Para ver informações sobre como permitir que as instâncias do emulador se comuniquem via TCP/UDP, consulte Interconectar instâncias do emulador.

Além disso, o endereço 127.0.0.1 na sua máquina de desenvolvimento corresponde à própria interface de loopback do emulador. Caso você queira acessar serviços em execução na interface de loopback da máquina de desenvolvimento (também conhecida como 127.0.0.1 na sua máquina), use o endereço especial 10.0.2.2.

Por fim, os endereços pré-alocados de um dispositivo emulado são específicos do Android Emulator e, provavelmente, serão muito diferentes em dispositivos reais (que também são muito propensos a ter o endereço de rede traduzido, especificamente, por trás de um roteador/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/roteador (físico) a que sua máquina esteja conectada.

O roteador virtual do emulador precisa conseguir lidar com todas as conexões e mensagens TCP e UDP de saída em nome do dispositivo emulado, desde que o ambiente de rede da máquina de desenvolvimento permita isso. Não há limitações internas quanto a números ou intervalos de porta, exceto a restrição imposta pelo sistema operacional e pela rede do host.

Dependendo do ambiente, o emulador pode não ser compatível com outros protocolos (como ICMP, usado para "ping"). Atualmente, o emulador não é compatível com 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 nesse roteador. Os clientes podem se conectar a uma porta de convidado especificada no roteador, enquanto o roteador direciona o tráfego de/para essa porta e para a porta do host do dispositivo emulado.

Para configurar o redirecionamento de rede, crie um mapeamento de portas/endereços de host e convidado na instância do emulador. Há duas maneiras de configurar o redirecionamento de rede: usando os comandos do console do emulador ou a ferramenta adb, conforme descrito abaixo.

Configurar o redirecionamento por meio do Console do Emulator

Cada instância do emulador oferece um console de controle a que você pode se conectar para emitir comandos específicos para essa instância. Você pode usar o comando do console redir 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 do 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 do emulador de destino, especificando o número de porta do console, da seguinte maneira:

telnet localhost 5554

Depois de estabelecer a conexão, use o comando redir para trabalhar com o redirecionamento. Para adicionar um redirecionamento, use:

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 simulado, respectivamente.

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, você pode usar o comando redir del. Para listar todos os redirecionamentos de uma instância específica, use redir list. Para ver mais informações sobre esses e outros comandos do console, consulte Usar o Console do Emulator.

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 por meio do adb

A ferramenta Android Debug Bridge (adb) oferece o encaminhamento de portas, uma maneira alternativa de configurar o redirecionamento de rede. Para ver mais informações, consulte Encaminhar portas, na documentação do adb.

No momento, o adb não oferece nenhuma maneira de remover um redirecionamento, exceto por meio da eliminação do servidor do 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 OS X, 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/OS X, %WINDOWS%/system32/HOSTS no Windows).

Ao iniciar o emulador na linha de comando, você também 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 exibida ao usar o navegador da Web.

Usar o emulador com um proxy

Em muitas redes corporativas, conexões diretas com a Internet não funcionam (elas são recusadas pelos administradores de rede), exceto quando acontecem por meio de um proxy específico. Navegadores da Web e outros apps corporativos são pré-configurados para usar o proxy, para que você possa navegar na Web. No caso de apps comuns, como o emulador, eles precisam saber que há um proxy e precisam se conectar a ele.

Devido à natureza do HTTP, uma conexão direta com o servidor da Web e uma conexão por meio de 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 meio de um servidor proxy, você poderá configurar um proxy HTTP personalizado na tela Extended controls do emulador. Com o emulador aberto, clique em More e depois em Settings e Proxy. Aqui, você pode definir as próprias 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/HTTPS especificado para todas as conexões TCP de saída. O redirecionamento para UDP não é compatível no momento.

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 do emulador

Para permitir que uma instância do emulador se comunique com outra, configure o redirecionamento de rede necessário, conforme ilustrado abaixo.

Suponha que seu ambiente seja:

  • 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

e você queira executar um servidor em B, a que C se conectará. Veja como configurá-lo:

  1. Configure o servidor em B, detectando 10.0.2.15:<serverPort>.
  2. No console 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 chamada de voz ou 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 chamada de voz ou SMS, use o app de telefone ou de mensagem de texto, respectivamente, a partir de um dos emuladores.

Para iniciar uma chamada de voz simulada para outra instância de emulador:

  1. Inicie o app de telefone na instância do emulador de origem.
  2. Como número a ser discado, insira o número da porta do console da instância para que você quer ligar. Você pode determinar o número da porta do console da instância de destino, verificando o título da janela, em que o número da porta do console é relatado como "Android Emulator (<port>)".
  3. Pressione "Dial". Uma nova chamada de entrada é exibida na instância do emulador de destino.

Para enviar uma mensagem SMS para outra instância de emulador, inicie o app de mensagem de texto (se disponível). Especifique o número da porta do console da instância do emulador de destino como o endereço do SMS, insira o texto da mensagem e envie. A mensagem é entregue para a instância do emulador de destino.

Você também pode se conectar a um console do emulador para simular o recebimento de uma chamada de voz ou de um SMS. Para ver mais informações, consulte Emulação de telefonia e Emulação de SMS.