我们的持续集成环境与OSX机器上的Android设备(也用于iOS和Android)存在一些类似的问题。
我相信问题是您允许Jenkins启动adb服务器。造成问题的原因是,Jenkins作业与存在的外壳相关联。如果Jenkins通过“ adb devices”调用启动了adb守护程序,则adb守护程序将归短暂的Jenkins Shell所拥有,当该Shell执行完并关闭后,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。基本上,这只是从用户启动守护程序运行adb启动服务器,以避免Jenkins拥有它。
<?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设备”并将其保持打开状态。