android docker adb

android - Conexión a un dispositivo USB USB en un contenedor Docker a través de ADB



(4)

Actualizar:

Terminé usando --privileged y -v para asignar la totalidad de /dev/bus/usb y parcheando adb para aceptar una variable de entorno para especificar el árbol del dispositivo USB raíz - /dev/bus/usb/001 etc.

Esto nos permitió usar diferentes buses USB para diferentes contenedores para diferentes grupos del mismo teléfono, y otro parche de variable de entorno permitió diferentes listas VID: PID para diferentes tipos de teléfonos.

Estamos tratando de asignar diferentes buses USB a diferentes contenedores Docker que ejecutan clientes de TeamCity .

Cada contenedor necesita la configuración ANDROID_ADB_SERVER_PORT en un puerto diferente (porque no estamos usando una red segregada).

La máquina host no puede ejecutar adbd , porque solo un adbd puede hablar con un teléfono en un momento dado.

Cada contenedor recibe uno de los directorios /dev/bus/usb/xxx , por lo que podemos conectar teléfonos en contenedores específicos.

Tenemos que sincronizar el directorio /dev/bus/usb/xxx cada pocos segundos, para permitir las /dev/bus/usb/xxx caliente y los reinicios, solo un bucle de shell en el host que ejecuta tar cf devxxx.tar /dev/bus/usb/xxx , docker cp para transferirlo, luego el docker exec para descomprimir dentro del contenedor /tmp , diff para detectar nodos para eliminar, y mv -n para mover nuevos nodos.

De hecho, dado que estamos ejecutando Linux, probablemente podamos configurar los scripts udev, según Howto, para ejecutar un script cuando se conecte un dispositivo USB .

He creado una imagen de Docker que contiene el SDK de Android y estoy tratando de exponer mi teléfono Android en un contenedor que ejecuta esta imagen. Así que utilicé la bandera --privileged y --privileged los dispositivos USB de la siguiente manera:

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

Sin embargo, cuando ejecuto dispositivos ADB, no me muestra el dispositivo USB:

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 dentro del contenedor enumera el dispositivo:

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

Sin embargo, el dispositivo es visible en el host:

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

Sistema operativo host

$ 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

Versión docker

$ docker --version Docker version 1.5.0, build a8a31ef

¿Cual podría ser el problema?


Esto no responde a la pregunta exacta que estaba haciendo, pero aborda lo que estaba tratando de lograr: conectarse a un dispositivo Android conectado a un host de docker desde un cliente adb que se ejecuta dentro de un contenedor de docker. Incluyo esto para cualquiera que intente lograr lo mismo (como lo era yo).

El cliente adb admite una opción -H que le indica dónde encontrar el servidor adb para conectarse. Docker admite el nombre de host "host.docker.internal", que siempre se asigna a la dirección IP del host de docker. Suponiendo que su dispositivo esté conectado al host de la ventana acoplable, puede hacer lo siguiente para que su cliente adb en contenedores se conecte al servidor de adb que se ejecuta en el host de la ventana acoplable:

adb -H host.docker.internal devices

Cumple el objetivo sin tener que montar los puertos USB.

Referencia: https://developer.android.com/studio/command-line/adb


Mientras intentaba lo mismo, me encontré con otros problemas relacionados con eso, que me gustaría compartir para que otros puedan ahorrar su tiempo:

Problema 1: lsusb no se instaló en el contenedor

En mi caso, lsusb no estaba instalado, así que lo instalé con el siguiente comando:

apt-get update apt-get install usbutils

Problema 2: no puedo ver el dispositivo incluso después de la instalación de lsusb y ADB SDK

Debe reiniciar su contenedor con la opción -v , y sí, no se olvide de matar el servidor ADB como se indica en una de las respuestas.

En el host:

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

En caso de que alguien quisiera hacerlo desde cero, he escrito una entrada de blog en él:

Cómo conectar dispositivos ADB al contenedor Linux


No creo que el demonio ADB que se ejecuta en el dispositivo se pueda conectar a dos servidores ADB. Intente desconectarlo del ADB de su máquina host y luego conéctelo al ADB del contenedor Docker.