Tivemos alguns problemas semelhantes com nosso ambiente de Integração Contínua com dispositivos Android de uma máquina OSX (também usada para iOS e Android).
Eu acredito que o problema é que você está permitindo que Jenkins inicie o servidor adb. Isso causa problemas porque os trabalhos de Jenkins estão associados a shells que entram e saem da existência. Se Jenkins iniciar o adb daemon com uma chamada "adb devices" (por exemplo), o adb daemon será de propriedade de alguns shell Jenkins de curta duração, e quando esse shell terminar de executar e fechar, o adb daemon será limpo , até que seja iniciado automaticamente por outra chamada de adb. Isso resulta em um ciclo de iniciar e parar o daemon adb, mas o que você quer é que ele permaneça indefinidamente.
Uma forma de corrigir isso é simplesmente executar "dispositivos adb" a partir de um shell que fica aberto na máquina do CI. Você pode dizer se é o processo pai se esta mensagem é mostrada após a execução
blah$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
xxxxxxxxxxx device
Este é um passo chato de ter que executar toda vez que sua máquina reinicia, e se alguém fechar a janela de comando, você voltará ao problema anterior.
Em teoria, uma maneira melhor seria criar um arquivo .plist para acionar o daemon adb na inicialização. Aqui está um exemplo: ~ / Library / LaunchAgents / server.adb.plist. Isso basicamente apenas executa adb start-server a partir do daemon de ativação do usuário para evitar que Jenkins o possua.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>server.adb</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/Users/Shared/Jenkins/android-sdk/platform-tools/adb</string>
<string>start-server</string>
</array>
</dict>
</plist>
O problema com isso, no entanto, é que ele começa a adb, mas ele não bloqueia, então você não pode usar a funcionalidade de controle de lançamento KeepAlive. Além disso, não parece funcionar para o propósito desejado. Se alguém souber de uma maneira de executar o adb no modo "daemon", para que ele não retorne, esse mecanismo launchctl poderá ser configurado para reiniciá-lo automaticamente se ele morrer, garantindo, portanto, que o Jenkins nunca seja o proprietário. Ah, bem, por enquanto eu só vou estar executando "dispositivos adb" em uma janela do shell e deixando-o aberto.