OSX 시스템의 iOS 장치 (iOS 및 Android에도 모두 사용)를 사용하는 Continuous Integration 환경과 비슷한 문제가있었습니다.
문제는 Jenkins가 adb 서버를 시작하도록 허용한다는 것입니다. Jenkins 작업이 들어오고 나가는 쉘과 연관되어 있기 때문에 문제가 발생합니다. Jenkins가 "adb devices"호출 (예를 들어)로 adb 데몬을 시작하면 수명이 짧은 Jenkins 셸이 adb 데몬을 소유하게되며 해당 셸이 실행을 마치고 닫으면 adb 데몬이 정리됩니다. 다른 adb 호출에 의해 자동으로 백업 될 때까지 이로 인해 adb 데몬을 시작 및 중지하는주기가 발생하지만 원하는 것은 무기한으로 유지하는 것입니다.
이 문제를 해결하는 한 가지 방법은 CI 시스템에 열려있는 셸에서 "adb 장치"를 실행하는 것입니다. 실행 후이 메시지가 표시되는지 여부에 따라 상위 프로세스인지 알 수 있습니다.
blah$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
xxxxxxxxxxx device
이것은 컴퓨터를 다시 시작할 때마다 수행 해야하는 성가신 단계이며 누군가가 해당 명령 창을 닫으면 이전 문제로 돌아갑니다.
이론적으로 더 나은 방법은 .plist 파일을 만들어 부팅시 adb 데몬을 트리거하는 것입니다. 예는 다음과 같습니다. ~ / Library / LaunchAgents / server.adb.plist. 이것은 기본적으로 Jenkins가 소유하지 않도록 사용자 시작 데몬에서 adb start-server를 실행합니다.
<?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>
그러나이 문제는 adb 만 시작하지만 차단되지 않으므로 KeepAlive 실행 제어 기능을 사용할 수 없다는 것입니다. 또한 원하는 목적으로 작동하지 않는 것 같습니다. 누구든지 "데몬"모드에서 adb를 실행하는 방법을 알고 있어도 반환되지 않으면이 launchctl 메커니즘이 종료되면 자동으로 다시 시작하도록 설정하여 Jenkins가 소유권을 얻지 못하게 할 수 있습니다. 글쎄, 지금은 셸 창에서 "adb 장치"를 실행하고 열어 두겠습니다.