Cómo configurar las redes de Android Emulator

El emulador proporciona funciones de red versátiles que puedes usar para configurar entornos de prueba y modelado complejos para tu app. En esta página, se presentan las funciones y la arquitectura de red del emulador.

Espacio de direcciones de red

Cada instancia del emulador se ejecuta detrás de un router virtual o servicio de firewall que la aísla de Internet y de las interfaces y configuraciones de red de la máquina de desarrollo. Un dispositivo emulado no puede ver tu máquina de desarrollo ni otras instancias del emulador en la red. Solo detecta que está conectado a través de Ethernet a un router o firewall.

Para cada instancia, el router virtual administra el espacio de direcciones de red 10.0.2/24. Todas las direcciones administradas por el router tienen el formato 10.0.2.xx, donde xx es un número. El emulador o el router asignan previamente las direcciones dentro de este espacio de la siguiente manera:

Dirección de red Descripción
10.0.2.1 Dirección del router o la puerta de enlace
10.0.2.2 Alias especial de la interfaz de bucle invertido del host (es decir, 127.0.0.1 en tu máquina de desarrollo)
10.0.2.3 Primer servidor DNS
10.0.2.4/10.0.2.5/10.0.2.6 Segundo, tercer y cuarto servidor DNS opcional
10.0.2.15 La red del dispositivo emulado cuando se conecta mediante Ethernet
10.0.2.16 La red del dispositivo emulado cuando se conecta mediante Wi-Fi
127.0.0.1 La interfaz de bucle invertido del dispositivo emulado

Todas las instancias del emulador en ejecución utilizan las mismas asignaciones de direcciones. Eso significa que, si tienes dos instancias ejecutándose simultáneamente en tu máquina, cada una tendrá su propio router y una dirección IP de 10.0.2.15. Las instancias están aisladas por un router y no pueden detectarse entre ellas en la misma red. Para obtener información sobre cómo permitir que las instancias del emulador se comuniquen a través de TCP/UDP, consulta la sección sobre la interconexión de instancias del emulador.

La dirección 127.0.0.1 en tu máquina de desarrollo corresponde a la interfaz de bucle invertido del emulador. Para acceder a los servicios que se ejecutan en la interfaz de bucle invertido de la máquina de desarrollo, debes usar la dirección especial 10.0.2.2.

Las direcciones preasignadas de un dispositivo emulado son específicas de Android Emulator y es posible que sean muy diferentes en dispositivos reales (que es probable que también sean traducciones de direcciones de red, específicamente detrás de un router o firewall).

Limitaciones de redes locales

Las apps para Android que se ejecutan en un emulador pueden conectarse a la red disponible en tu estación de trabajo. Sin embargo, allí se conectan a través del emulador, no directamente al hardware, y el emulador funciona como una app normal en tu estación de trabajo, lo que puede causar limitaciones como las siguientes:

  • Podría bloquearse la comunicación con el dispositivo emulado debido a un programa de firewall que se ejecuta en tu máquina.
  • Podría bloquearse la comunicación con el dispositivo emulado debido a otro router o firewall (físico) en el que está conectada la máquina.

El router virtual del emulador debe ser capaz de administrar todas las conexiones y los mensajes TCP y UDP salientes por parte del dispositivo emulado, siempre que lo permita el entorno de red de la máquina de desarrollo. No hay limitaciones integradas en los números de puerto o rangos, excepto las impuestas por el sistema operativo y la red host.

Según el entorno, es posible que el emulador no sea compatible con otros protocolos (como ICMP, que se utiliza para "hacer ping"). Por el momento, el emulador no es compatible con IGMP ni con multicast.

Cómo usar el redireccionamiento de red

Para comunicarte con una instancia de emulador detrás del router virtual, debes configurar en este el redireccionamiento de red. Luego, los clientes pueden conectarse a un puerto de invitado específico en el router mientras este direcciona el tráfico desde o hacia ese puerto al puerto de host del dispositivo emulado.

Para configurar la redirección de red, crea una asignación de puertos o direcciones de host e invitados en la instancia del emulador. Hay dos maneras de configurar el redireccionamiento de red: usando los comandos de la consola del emulador y con la herramienta Android Debug Bridge (adb), como se describe en las siguientes secciones.

Cómo configurar el redireccionamiento con la consola del emulador

Cada instancia del emulador proporciona una consola de control a la que puedes conectarte para emitir comandos específicos a esa instancia. Usa el comando redir de la consola para configurar el redireccionamiento según sea necesario para una instancia del emulador.

Primero, determina el número de puerto de la consola para la instancia del emulador de destino. Por ejemplo, el número de puerto de la consola para la primera instancia del emulador que se inició es 5554. Luego, conéctate a la consola de la instancia del emulador de destino y especifica el número de puerto de la siguiente manera:

telnet localhost 5554

Una vez conectado, debes autenticarte antes de poder configurar el redireccionamiento. Consulta Cómo iniciar y detener una sesión de la consola para obtener detalles sobre cómo hacerlo. Una vez que hayas completado la autenticación, usa el comando redir para trabajar con el redireccionamiento.

Si quieres agregar un redireccionamiento, usa:

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

Donde <protocol> puede ser tcp o udp, y <host-port> y <guest-port> establecen la asignación entre tu máquina y el sistema emulado.

Por ejemplo, el siguiente comando configura un redireccionamiento que controla todas las conexiones TCP entrantes a tu máquina host (de desarrollo) en 127.0.0.1:5000 y las pasa al sistema emulado en 10.0.2.15:6000:

redir add tcp:5000:6000

Para borrar un redireccionamiento, usa el comando redir del. Para enumerar todos los redireccionamientos de una instancia específica, usa redir list. Para obtener más información sobre estos y otros comandos de la consola, consulta Cómo enviar comandos de la consola del emulador.

Ten en cuenta que los números de puerto están restringidos por tu entorno local. En general, esto significa que no puedes usar números de puerto de host inferiores a 1024 sin privilegios especiales de administrador. Además, no podrás configurar un redireccionamiento para un puerto de host que ya esté usando otro proceso de tu máquina. En ese caso, redir genera un mensaje de error a tal efecto.

Cómo configurar el redireccionamiento con adb

La herramienta Android Debug Bridge (adb) proporciona redirección de puertos, una forma alternativa para configurar el redireccionamiento de red. Para obtener más información, consulta Cómo configurar la redirección de puertos en la documentación adb.

Ten en cuenta que, por el momento, adb no ofrece una manera de quitar un redireccionamiento, excepto si detienes el servidor de adb.

Cómo establecer la configuración de DNS del emulador

Durante el inicio, el emulador lee la lista de servidores DNS que está utilizando tu sistema. Luego, almacena las direcciones IP de hasta cuatro servidores en esa lista y establece alias en las direcciones emuladas 10.0.2.3, 10.0.2.4, 10.0.2.5 y 10.0.2.6, según sea necesario.

En Linux y macOS, el emulador obtiene las direcciones del servidor DNS analizando el archivo /etc/resolv.conf. En Windows, el emulador obtiene las direcciones llamando a la API GetNetworkParams(). Ten en cuenta que, en general, esto significa que el emulador ignora el contenido de tu archivo "hosts" (/etc/hosts en Linux/macOS y %WINDOWS%/system32/HOSTS en Windows).

Cuando se inicia el emulador desde la línea de comandos, también puedes usar la opción -dns-server <serverList> para especificar de forma manual las direcciones de los servidores DNS que se usarán, donde <serverList> es una lista de nombres de servidores o direcciones IP separadas por comas. Esta opción te puede ser útil si tienes problemas de resolución de DNS en la red emulada (por ejemplo, si aparece el mensaje "Error de host desconocido" cuando usas el navegador web).

Cómo usar el emulador con un proxy

En muchas redes corporativas, los administradores de red rechazan las conexiones directas a Internet. En su lugar, las conexiones a Internet deben pasar a través de un proxy específico. Para acceder a Internet en una red que tiene un requisito de proxy, el emulador debe saber que hay un proxy y que debe conectarse a él.

Debido a la naturaleza de HTTP, una conexión directa al servidor web y una conexión mediante un proxy producen solicitudes GET diferentes. Para poder funcionar, el emulador reescribe de forma transparente las solicitudes GET del dispositivo virtual antes de comunicarse con el proxy.

Si el emulador debe usar un servidor proxy para acceder a Internet, puedes configurar un proxy HTTP personalizado desde la pantalla Extended controls del emulador.

  1. Con el emulador abierto, haz clic en More .
  2. Haz clic en Settings y Proxy.
  3. Define la configuración de proxy HTTP.

Como alternativa, puedes configurar un proxy desde la línea de comandos con la opción -http-proxy <proxy> cuando inicias el emulador. En este caso, especifica la información del proxy en <proxy> en uno de estos formatos:

http://<machineName>:<port>

o

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

La opción -http-proxy obliga al emulador a usar el proxy HTTP/HTTPS especificado para todas las conexiones TCP salientes. No se admite el redireccionamiento para UDP.

Como alternativa, puedes definir la variable de entorno http_proxy con el valor que deseas usar para <proxy>. En ese caso, no necesitas especificar un valor para <proxy> en el comando -http-proxy, ya que el emulador verifica el valor de la variable de entorno http_proxy durante el inicio y lo usa automáticamente si está definido.

Puedes usar la opción -debug-proxy para diagnosticar problemas de conexión de proxy.

Cómo interconectar instancias del emulador

Para permitir que una instancia del emulador se comunique con otra, configura el redireccionamiento de red como se describe a continuación.

Supongamos que tu entorno se representa de la siguiente manera:

  • A es tu máquina de desarrollo.
  • B es tu primera instancia de emulador que se ejecuta en A.
  • C es tu segunda instancia de emulador que también se ejecuta en A.

Si deseas ejecutar un servidor en B al que se conectará C, configúralo de la siguiente manera:

  1. Configura el servidor en B y que escuche 10.0.2.15:<serverPort>.
  2. En la consola B, configura un redireccionamiento de A:localhost:<localPort> a B:10.0.2.15:<serverPort>.
  3. En C, pide al cliente que se conecte a 10.0.2.2:<localPort>.

Por ejemplo, si deseas ejecutar un servidor HTTP, selecciona <serverPort> como 80 y <localPort> como 8080:

  • B escucha en 10.0.2.15:80.
  • En la consola B, emite redir add tcp:8080:80..
  • C se conecta con 10.0.2.2:8080.

Cómo enviar una llamada de voz o un SMS a otra instancia del emulador

El emulador reenvía automáticamente llamadas de voz y mensajes SMS simulados de una instancia a otra. Para enviar una llamada de voz o un SMS, usa la app de Teléfono o la app de SMS, respectivamente, de uno de los emuladores.

Si quieres iniciar una llamada de voz simulada a otra instancia del emulador:

  1. Inicia la app de Teléfono en la instancia del emulador de origen.
  2. Como el número que se marcará, ingresa el número de puerto de la consola de la instancia de destino.

    Puedes determinar el número de puerto de la consola de la instancia de destino si verificas el título de la ventana, si se ejecuta en una ventana independiente, pero no si se ejecuta en una ventana de herramientas. El número de puerto de la consola se indica como "Android Emulator (<port>)".

    Además, el comando adb devices imprime una lista de dispositivos virtuales en ejecución y sus números de puerto de consola. Para obtener más información, consulta Cómo realizar consultas de dispositivos.

  3. Haz clic en el botón de marcado. Aparecerá una nueva llamada entrante en la instancia del emulador de destino.

Para enviar un mensaje SMS a otra instancia del emulador, haz lo siguiente:

  1. Inicia la app de SMS, si está disponible.
  2. Especifica el número de puerto de la consola de la instancia del emulador de destino como la dirección de SMS.
  3. Ingresa el texto del mensaje.
  4. Envía el mensaje. Se entregará el mensaje a la instancia del emulador de destino.
  5. También puedes conectarte a una consola de emulador para simular una llamada de voz o un SMS entrantes. Para obtener más información, consulta las secciones Emulación de telefonía y Emulación de SMS.