Estamos configurando un servidor de integración continua para nuestro desarrollo de Android y nos hemos encontrado rápidamente con el problema de ADB a la espera del dispositivo .
Para el registro, ya hemos probado muchas combinaciones de adb kill-server
, adb start-server
, adb devices
, etc en vano.
Lamentablemente, todo lo que he encontrado en Internet son variaciones de "desconectar y volver a conectar el dispositivo", lo que obviamente no es una solución para nosotros (no podemos evitar que un ser humano se siente junto al servidor de CI para desconectar y volver a conectar dispositivos antes) cada construcción).
Como información básica, utilizamos Jenkins en una Mac, ya que también ejecuta nuestro CI para iOS.
Al abordar el problema, pensé que si en el nivel del sistema operativo se encuentra el dispositivo, eso es al menos un comienzo. De hecho, ejecutar un comando como system_profiler SPUSBDataType
encuentra con éxito el dispositivo, incluido el número de serie que informa ADB cuando funciona correctamente.
He intentado algunos comandos poco convincentes para "actualizar" toda la actividad de USB, pero no he ido a ninguna parte. No es que pueda montar / desmontar el dispositivo, pero para ser honesto, ni siquiera estoy seguro de dónde está el problema, no sé lo suficiente sobre protocolos USB de bajo nivel, y mucho menos para Mac. Mi acecho del código fuente de ADB fue muy, muy lejano.
Por lo tanto, en este punto, soy todo oídos para una solución que nos permita ejecutar Android constantemente en nuestro servidor CI. Ya sea unos pocos comandos antes de cada trabajo de Jenkins, parcheando ADB o cualquier otro truco de magia negra.
Habilitado la depuración de USB (Configuración => Opciones de desarrollador) en el teléfono.
fuente
Tuvimos algunos problemas similares con nuestro entorno de Integración Continua con dispositivos Android desde una máquina OSX (también para iOS y Android).
Creo que el problema es que está permitiendo que Jenkins inicie el servidor adb. Esto causa problemas porque los trabajos de Jenkins están asociados con los depósitos que entran y salen de la existencia. Si Jenkins inicia el demonio adb con una llamada de "dispositivos adb" (por ejemplo), entonces el demonio adb será propiedad de un shell de Jenkins de corta duración, y cuando ese shell termine de ejecutarse y se cierre, el demonio adb se limpiará , hasta que otra llamada adb lo inicie automáticamente. Esto da como resultado un ciclo de inicio y detención del demonio adb, pero lo que quieres es que permanezca despierto indefinidamente.
Una forma de solucionar esto es simplemente ejecutar "dispositivos adb" desde un shell que se deja abierto en la máquina CI. Puede saber si es el proceso principal si este mensaje se muestra después de ejecutarse
Este es un paso molesto que debe realizar cada vez que su máquina se reinicia, y si alguien cierra esa ventana de comandos, volverá al problema anterior.
En teoría, una mejor manera sería hacer un archivo .plist para activar el demonio adb en el arranque. Aquí hay un ejemplo: ~ / Library / LaunchAgents / server.adb.plist. Básicamente, esto solo ejecuta adb start-server desde el daemon de inicio del usuario para evitar que Jenkins sea el propietario.
Sin embargo, el problema con esto es que solo inicia adb, pero no se bloquea, por lo que no puede usar la funcionalidad de control de inicio KeepAlive. Además, no parece funcionar para el propósito deseado. Si alguien conoce una forma de ejecutar adb en modo "daemon", para que no regrese, entonces este mecanismo de launchctl podría configurarse para reiniciarlo automáticamente si muere, asegurando así que Jenkins nunca obtenga la propiedad. Bueno, por ahora solo estaré ejecutando "dispositivos adb" en una ventana de shell y dejándolo abierto.
fuente
Resolví esto usando una regleta de alimentación programable para reiniciar los concentradores usb antes de cada ejecución de prueba. Esto hizo lo mismo que desconectar y volver a enchufar los cables usb.
fuente
Solo quería seguir la excelente sugerencia de juan-delgado . En MacOS High Sierra descubrí que ejecutar
adb
cada 10 segundos con elwatch
comando también era efectivo como una solución rápida:Esto me permite evitar crear un
.plist
archivo, pero el inconveniente obvio es que no es una solución permanente. Elwatch
comando está disponible en versiones anteriores de OSX, por lo que también debería ser efectivo allí.fuente
watch
en macOS Catalina, pero pude instalarlo fácilmentebrew install watch
.Resuelto aquí cambiando el cable USB
fuente