Cómo configurar las herramientas de redes de Android Emulator

El emulador proporciona capacidades de herramientas de redes versátiles que puedes usar para configurar entornos complejos de modelado y prueba para tus apps. En las siguientes secciones, se presentan la arquitectura y las capacidades de la 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 ve que estás 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 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 host de bucle invertido (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 (si corresponde)
10.0.2.15 La interfaz de red o Ethernet del dispositivo emulado
127.0.0.1 La interfaz de bucle invertido del dispositivo emulado

Ten en cuenta que 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 verse 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 Cómo interconectar instancias del emulador.

Además, ten en cuenta que la dirección 127.0.0.1 de tu máquina de desarrollo corresponde a la propia interfaz de bucle invertido del emulador. Si deseas acceder a los servicios que se ejecutan en la interfaz de bucle invertido de la máquina de desarrollo (también conocido como 127.0.0.1 en tu máquina), debes usar la dirección especial 10.0.2.2.

Por último, ten en cuenta que 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 NAT, específicamente detrás de un router o firewall).

Limitaciones de herramientas de redes locales

Las apps de 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, lo que puede causar algunas limitaciones:

  • 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 otro firewall o router (físico) al 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 la impuesta 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 multidifusión.

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 formas de configurar el redireccionamiento de red: usando los comandos de la consola del emulador y usando la herramienta adb, como se describe a continuación.

Cómo configurar el redireccionamiento mediante 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. Puedes usar el comando redir de la consola a fin de 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 que te conectes, usa el comando redir para trabajar con el redireccionamiento. Si quieres agregar un redireccionamiento, usa:

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

donde <protocol> es tcp o udp, y <host-port> y <guest-port> establecen la asignación entre tu propia máquina y el sistema emulado, respectivamente.

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, puedes usar el comando redir del. Si quieres detallar todo el redireccionamiento para una instancia específica, puedes usar redir list. Para obtener más información sobre estos y otros comandos de la consola, consulta Cómo usar 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 mediante 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 redireccionar puertos en la documentación de adb.

Ten en cuenta que, por el momento, adb no ofrece ninguna forma de quitar un redireccionamiento, excepto apagando el servidor de adb.

Cómo configurar los ajustes 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 OS X, 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 de GetNetworkParams(). Ten en cuenta que, en general, esto significa que el emulador ignora el contenido de tu archivo "hosts" (/etc/hosts en Linux/OS X 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 empresariales, no funcionan las conexiones directas a Internet (los administradores de red las rechazan), excepto si se realizan a través de un proxy específico. Los navegadores web y otras apps empresariales están preconfigurados para usar el proxy a fin de que puedas navegar por la Web. Las apps normales, como el emulador, necesitan saber si hay un proxy y si deben 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 acceder a Internet a través de un servidor proxy, puedes configurar un proxy HTTP personalizado desde la pantalla Extended controls del emulador. Con el emulador abierto, haz clic en More y, luego, en Settings y Proxy. Aquí, puedes definir tu propia 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. Por el momento, 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: el emulador verifica el valor de la variable de entorno http_proxy durante el inicio y lo usa de forma automática, 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, debes configurar el redireccionamiento de red necesario como se ilustra a continuación.

Supongamos que tu entorno incluye lo siguiente:

  • 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, sigue estos pasos para configurarlo:

  1. Configura el servidor en B y que reciba 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, puedes seleccionar <serverPort> como 80 y <localPort> como 8080:

  • B recibe 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 de forma automática 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 número, ingresa el número de puerto de la consola de la instancia a la que deseas llamar. Puedes determinar el número de puerto de la consola de la instancia de destino comprobando el título de su ventana, donde el número de puerto de la consola se indica como "Android Emulator (<puerto>)".
  3. Presiona "Dial". Aparecerá una nueva llamada entrante en la instancia del emulador de destino.

Para enviar un mensaje SMS a otra instancia del emulador, inicia la app de SMS (si está disponible). Especifica el número de puerto de la consola de la instancia del emulador de destino como la dirección de SMS, ingresa el texto del mensaje y envía el mensaje. Se entregará el mensaje a la instancia del emulador de destino.

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 Emulación de telefonía y Emulación de SMS.