Configurer la mise en réseau d'Android Emulator

L'émulateur fournit des fonctionnalités de mise en réseau polyvalentes que vous pouvez utiliser afin de configurer des environnements de modélisation et de test complexes pour votre application. Cette page présente l'architecture réseau et les fonctionnalités de l'émulateur.

Espace d'adressage réseau

Chaque instance de l'émulateur s'exécute derrière un service de pare-feu ou de routeur virtuel qui l'isole des paramètres et des interfaces réseau de votre ordinateur de développement, ainsi que d'Internet. Un appareil émulé ne peut pas détecter votre ordinateur de développement ni les autres instances d'émulateur présentes sur le réseau. Il détecte uniquement qu'il est connecté via Ethernet à un routeur ou à un pare-feu.

Le routeur virtuel de chaque instance gère l'espace d'adressage réseau 10.0.2/24. Toutes les adresses gérées par le routeur prennent la forme 10.0.2.xx, où xx correspond à un nombre. Les adresses de cet espace sont préallouées par l'émulateur ou le routeur comme suit :

Adresse réseau Description
10.0.2.1 Adresse du routeur ou de la passerelle
10.0.2.2 Alias spécial de votre interface de rebouclage hôte (127.0.0.1 sur votre ordinateur de développement)
10.0.2.3 Premier serveur DNS
10.0.2.4/10.0.2.5/10.0.2.6 Deuxième, troisième et quatrième serveurs DNS facultatifs
10.0.2.15 Réseau de l'appareil émulé en cas de connexion via Ethernet
16.0.2.16 Réseau de l'appareil émulé en cas de connexion via le Wi-Fi
127.0.0.1 Interface de rebouclage de l'appareil émulé

Les mêmes attributions d'adresses sont utilisées par toutes les instances d'émulateur en cours d'exécution. Cela signifie que si deux instances s'exécutent simultanément sur votre ordinateur, chacune possède son propre routeur et une adresse IP 10.0.2.15. Les instances sont isolées par un routeur et ne peuvent pas se détecter sur le même réseau. Pour savoir comment autoriser les instances d'émulateur à communiquer via TCP/UDP, consultez la section sur l'interconnexion des instances d'émulateur.

L'adresse 127.0.0.1 de votre ordinateur de développement correspond à la propre interface de rebouclage de l'émulateur. Pour accéder aux services exécutés sur l'interface de rebouclage de votre ordinateur de développement, utilisez plutôt l'adresse spéciale 10.0.2.2.

Les adresses pré-allouées d'un appareil émulé sont spécifiques à l'émulateur Android et sont probablement très différentes sur les appareils réels (qui sont également susceptibles d'être traduites en adresse réseau, en particulier derrière un routeur ou un pare-feu).

Limites de la mise en réseau locale

Les applications Android exécutées sur un émulateur peuvent se connecter au réseau disponible sur votre poste de travail. Toutefois, les applications se connectent via l'émulateur, et non directement au matériel, et l'émulateur agit comme une application normale sur votre poste de travail. Cela peut s'accompagner de certaines limites :

  • La communication avec l'appareil émulé peut être bloquée par un programme de pare-feu exécuté sur votre ordinateur.
  • La communication avec l'appareil émulé peut être bloquée par un autre pare-feu ou routeur (physique) auquel votre ordinateur est connecté.

Le routeur virtuel de l'émulateur doit pouvoir gérer toutes les connexions et tous les messages TCP et UDP sortants pour le compte de l'appareil émulé, à condition que l'environnement réseau de votre ordinateur de développement le permette. Il n'existe aucune limitation intégrée en ce qui concerne les numéros de port ou les plages, sauf celle imposée par le système d'exploitation et le réseau hôte.

Selon l'environnement, l'émulateur peut ne pas prendre en charge d'autres protocoles (comme ICMP, utilisé pour "ping"). Actuellement, l'émulateur ne prend pas en charge IGMP ni la multidiffusion.

Utiliser la redirection réseau

Pour communiquer avec une instance d'émulateur derrière son routeur virtuel, configurez la redirection réseau sur le routeur virtuel. Les clients peuvent ensuite se connecter à un port invité spécifié sur le routeur, tandis que celui-ci dirige le trafic sortant et entrant de ce port vers le port hôte de l'appareil émulé.

Pour configurer la redirection réseau, vous devez créer un mappage des ports et des adresses hôtes et invités sur l'instance d'émulateur. Vous pouvez configurer la redirection réseau de deux manières : à l'aide des commandes de la console de l'émulateur ou de l'outil Android Debug Bridge (adb), comme décrit dans les sections suivantes.

Configurer la redirection via la console de l'émulateur

Chaque instance d'émulateur fournit une console de contrôle à laquelle vous pouvez vous connecter pour émettre des commandes spécifiques à cette instance. Utilisez la commande redir de la console pour configurer la redirection, si nécessaire, pour une instance d'émulateur.

Commencez par déterminer le numéro de port de la console pour l'instance d'émulateur cible. Par exemple, le numéro de port de la console pour la première instance d'émulateur lancée est 5554. Ensuite, connectez-vous à la console de l'instance d'émulateur cible en spécifiant son numéro de port, comme suit :

telnet localhost 5554

Une fois connecté, vous devez vous authentifier avant de pouvoir configurer la redirection. Pour en savoir plus, consultez la section Démarrer et arrêter une session de console. Une fois que vous êtes authentifié, utilisez la commande redir pour effectuer la redirection.

Pour ajouter une redirection, utilisez :

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

<protocol> correspond à tcp ou udp, et <host-port> et <guest-port> définissent respectivement le mappage entre votre ordinateur et le système émulé.

Par exemple, la commande suivante configure une redirection qui gère toutes les connexions TCP entrantes vers votre ordinateur hôte (ordinateur de développement) sur 127.0.0.1:5000 et les transmet au système émulé sur 10.0.2.15:6000 :

redir add tcp:5000:6000

Pour supprimer une redirection, utilisez la commande redir del. Pour afficher toutes les redirections pour une instance spécifique, utilisez redir list. Pour en savoir plus sur ces commandes et sur d'autres commandes de la console, consultez la section Envoyer des commandes à la console de l'émulateur.

Notez que les numéros de port sont limités par votre environnement local. Cela signifie généralement que vous ne pouvez pas utiliser de numéros de port hôte inférieurs à 1024 sans droits d'administrateur spéciaux. En outre, vous ne pouvez pas configurer la redirection d'un port hôte déjà utilisé par un autre processus sur votre machine. Dans ce cas, redir génère un message d'erreur.

Configurer la redirection via adb

L'outil Android Debug Bridge (adb) propose un transfert de port, qui vous permet de configurer une redirection réseau. Pour en savoir plus, consultez la section Configurer le transfert de port dans la documentation adb.

Notez qu'actuellement, adb ne permet pas de supprimer une redirection, sauf en arrêtant le serveur adb.

Configurer les paramètres DNS de l'émulateur

Au démarrage, l'émulateur lit la liste des serveurs DNS utilisés par votre système. Il stocke ensuite les adresses IP d'un maximum de quatre serveurs sur cette liste et définit les alias correspondants sur les adresses émulées 10.0.2.3, 10.0.2.4, 10.0.2.5 et 10.0.2.6, selon les besoins.

Sous Linux et macOS, l'émulateur obtient les adresses du serveur DNS en analysant le fichier /etc/resolv.conf. Sous Windows, l'émulateur obtient les adresses en appelant l'API GetNetworkParams(). Notez que cela signifie généralement que l'émulateur ignore le contenu de votre fichier "hosts" (/etc/hosts sous Linux/macOS, %WINDOWS%/system32/HOSTS sous Windows).

Lorsque vous démarrez l'émulateur via la ligne de commande, vous pouvez utiliser l'option -dns-server <serverList> pour spécifier manuellement les adresses des serveurs DNS à utiliser, où <serverList> correspond à une liste de noms de serveurs ou d'adresses IP séparés par une virgule. Cette option peut s'avérer utile si vous rencontrez des problèmes de résolution DNS dans le réseau émulé (par exemple, le message "Erreur d'hôte inconnu" s'affiche lorsque vous utilisez le navigateur Web).

Utiliser l'émulateur avec un proxy

Sur de nombreux réseaux d'entreprise, les connexions directes à Internet sont refusées par les administrateurs réseau, sauf si elles passent par un proxy spécifique. Pour accéder à Internet sur un réseau qui requiert un proxy, l'émulateur doit savoir qu'il existe un proxy et qu'il doit s'y connecter.

En raison de la nature du protocole HTTP, une connexion directe à un serveur Web et une connexion via un proxy se traduisent par des requêtes GET différentes. L'émulateur réécrit de manière transparente les requêtes GET de l'appareil virtuel avant de communiquer avec le proxy.

Si votre émulateur doit accéder à Internet via un serveur proxy, vous pouvez configurer un proxy HTTP personnalisé à partir de l'écran Extended controls (Commandes avancées) de l'émulateur:

  1. Une fois l'émulateur ouvert, cliquez sur More (Plus) .
  2. Cliquez sur Settings (Paramètres) et Proxy.
  3. Définissez vos paramètres de proxy HTTP.

Vous pouvez également configurer un proxy à partir de la ligne de commande à l'aide de l'option -http-proxy <proxy> lors du démarrage de l'émulateur. Dans le cas présent, spécifiez les informations de proxy dans <proxy> dans l'un des formats suivants :

http://<machineName>:<port>

ou

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

L'option -http-proxy force l'émulateur à utiliser le proxy HTTP ou HTTPS spécifié pour toutes les connexions TCP sortantes. La redirection pour UDP n'est pas compatible.

Vous pouvez également définir la variable d'environnement http_proxy sur la valeur que vous souhaitez utiliser pour <proxy>. Dans ce cas, vous n'avez pas besoin de spécifier une valeur pour <proxy> dans la commande -http-proxy. L'émulateur vérifie la valeur de la variable d'environnement http_proxy au démarrage et l'utilise automatiquement si elle est définie.

Vous pouvez utiliser l'option -debug-proxy pour diagnostiquer les problèmes de connexion proxy.

Interconnecter des instances d'émulateur

Pour permettre à une instance d'émulateur de communiquer avec une autre, configurez la redirection réseau comme décrit ci-dessous.

Supposons que votre environnement soit représenté comme suit :

  • A correspond à votre ordinateur de développement.
  • B correspond à votre première instance d'émulateur, exécutée sur A.
  • C correspond à votre deuxième instance d'émulateur, également exécutée sur A.

Si vous souhaitez exécuter un serveur sur B, serveur auquel C se connectera, configurez-le comme suit :

  1. Configurez le serveur sur B en écoutant 10.0.2.15:<serverPort>.
  2. Dans la console B, configurez une redirection de A:localhost:<localPort> vers B:10.0.2.15:<serverPort>.
  3. Sur C, demandez au client de se connecter à 10.0.2.2:<localPort>.

Par exemple, si vous souhaitez exécuter un serveur HTTP, indiquez 80 comme <serverPort> et 8080: comme <localPort> :

  • B écoute sur 10.0.2.15:80.
  • Dans la console B, émettez redir add tcp:8080:80..
  • C se connecte à 10.0.2.2:8080.

Passer un appel vocal ou envoyer un SMS à une autre instance d'émulateur

L'émulateur transfère automatiquement les appels vocaux et les SMS simulés d'une instance à une autre. Pour passer un appel vocal ou envoyer un SMS, utilisez respectivement l'application Téléphone ou l'application SMS de l'un des émulateurs.

Pour lancer un appel vocal simulé vers une autre instance d'émulateur :

  1. Lancez l'application Téléphone sur l'instance d'émulateur d'origine.
  2. Pour le numéro à composer, saisissez le numéro de port de la console de l'instance cible.

    Pour déterminer le numéro de port de la console de l'instance cible, consultez le titre de sa fenêtre, si elle s'exécute dans une fenêtre distincte, mais pas dans une fenêtre d'outil. Le numéro de port de la console est indiqué sous la forme "Android Emulator (<port>)".

    En outre, la commande adb devices affiche la liste des appareils virtuels en cours d'exécution et les numéros de port de leur console. Pour en savoir plus, consultez la section Requête pour des appareils.

  3. Cliquez sur le bouton d'appel. Un nouvel appel entrant apparaît dans l'instance d'émulateur cible.

Pour envoyer un SMS à une autre instance de l'émulateur, procédez comme suit :

  1. Lancez l'application SMS, le cas échéant.
  2. Indiquez le numéro de port de la console de l'instance d'émulateur cible comme adresse SMS.
  3. Saisissez le texte du message et envoyez-le.
  4. Envoie le message. Le message est envoyé à l'instance d'émulateur cible.
  5. Vous pouvez également vous connecter à une console d'émulateur pour simuler un appel vocal ou un SMS entrant. Pour plus d'informations, consultez Émulation de téléphonie et Émulation de SMS.