web-dev-qa-db-fra.com

Connexion à un périphérique Android USB dans un conteneur Docker via ADB

J'ai créé une image Docker contenant le SDK Android et j'essaie d'exposer mon téléphone Android dans un conteneur exécutant cette image. J'ai donc utilisé l'indicateur --privileged et monté les périphériques USB comme suit:

$ docker run --privileged -v /dev/bus/usb:/dev/bus/usb -d -P my-Android:0.0.1

Cependant, lorsque j'exécute des périphériques ADB, le périphérique USB ne s'affiche pas:

ubuntu@d56b666be455:~/Android/Sdk/platform-tools$ ./adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached

ubuntu@d56b666be455:~/Android/Sdk/platform-tools$

lsusb à l'intérieur du conteneur répertorie le périphérique:

ubuntu@d56b666be455:~$ lsusb
...
Bus 002 Device 017: ID 04e8:6866 Samsung Electronics Co., Ltd GT-I9300 Phone [Galaxy S III] (debugging mode)

Le périphérique est toutefois visible sur l'hôte:

⇒  ./adb devices
List of devices attached
4d11abcd65b74045    device

OS hôte

$ uname -a
Linux ananya 3.16.0-33-generic #44~14.04.1-Ubuntu SMP Fri Mar 13 10:33:29 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Version Docker

$ docker --version
Docker version 1.5.0, build a8a31ef

Quel pourrait être le problème?

17
buzypi

Je ne pense pas que le démon ADB exécuté sur le périphérique puisse être connecté à deux serveurs ADB. Essayez de le déconnecter de la base de données de votre ordinateur hôte, puis connectez-le à la base de données du conteneur Docker.

13
jlhonora

Tandis que j'essayais la même chose, j'ai rencontré d'autres problèmes liés à cela, que j'aimerais partager afin que d'autres puissent gagner du temps:

Problème 1: lsusb n'était pas installé dans le conteneur

Dans mon cas lsusb n'était pas installé, je l'ai donc installé avec la commande ci-dessous:

apt-get update
apt-get install usbutils

Problème 2: impossible de voir le périphérique même après l'installation du kit de développement logiciel (SDK) lb et ADB

Vous devez redémarrer votre conteneur avec l'option -v et, oui, n'oubliez pas de tuer le serveur ADB comme indiqué dans l'une des réponses.

Sur l'hôte:

adb-kill server
docker run -ti -d --privileged -v /dev/bus/usb:/dev/bus/usb   container_name

Au cas où quelqu'un voudrait le faire à partir de zéro, j'ai écrit un article de blog à ce sujet:

Comment connecter des périphériques ADB au conteneur Linux

1
pankaj mishra

Cela ne répond pas à la question que vous posiez, mais répond à ce que vous tentiez d'accomplir - la connexion à un appareil Android connecté à un hôte de menu fixe à partir d'un client adb s'exécutant à l'intérieur d'un conteneur de menu fixe. J'inclus ceci pour tous ceux qui essaient d'accomplir la même chose (comme j'étais).

Le client adb prend en charge une option -H qui lui indique où trouver le serveur adb auquel se connecter. Docker prend en charge le nom d'hôte "Host.docker.internal", qui correspond toujours à l'adresse IP de l'hôte de docker. En supposant que votre appareil soit connecté à l'hôte docker, vous pouvez procéder comme suit pour que votre client adb conteneurisé se connecte au serveur adb exécuté sur l'hôte docker: 

adb -H Host.docker.internal devices

Accomplit l'objectif sans avoir à monter les ports USB. 

Référence: https://developer.Android.com/studio/command-line/adb

0
RChavez