解决亚行“等待设备”问题


9

我们正在为我们的Android开发设置一个持续集成服务器,并且已经迅速陷入亚行等待设备问题的境地。

为了记录在案,我们已经尝试了很多的组合adb kill-serveradb start-serveradb devices等也没有用。

可悲的是,我在Internet上发现的只是“拔出并重新插入设备”的变体,这显然不是我们的解决方案(我们不能让人坐在CI服务器旁来拔出并重新插入设备,每个版本)。

作为背景,我们在Mac上使用Jenkins,因为它也运行iOS的CI。

在解决问题时,我认为如果在操作系统级别找到了该设备,那至少是一个开始。确实,运行类似system_profiler SPUSBDataType成功的命令会找到设备,包括正常工作时ADB报告的序列号。

我尝试了一些相当la脚的命令来“刷新”所有USB活动,但是我什么也没做。不是说您可以安装/卸载设备,而是说实话,我什至不知道问题出在哪里,我对低级USB协议的了解还不够,更不用说Mac了。我潜伏在ADB源代码中的过程非常长远。

因此,在这一点上,我迫不及待地想找到一个解决方案,该解决方案允许我们在CI服务器上始终运行Android。在詹金斯(Jenkins)的每项工作之前,只需执行几个命令,即可修补ADB或任何其他黑魔术。

Answers:


9

找到了解决问题的方法,因此在此处发布以保持完整性。请注意,我并不是说这是解决问题的最佳方法,但这对我们有用。

因此,我们意识到问题是在长时间未使用CI(在几小时范围内)后发生的。因此,我们创建了一个简单的脚本,adb devices每10秒调用一次。问题消失了,不再有“等待设备”的问题。

在Linux上,您可以轻松完成此操作cron;在OSX上launchctl,您可以轻松完成此操作,并且我肯定有Windows等效版本。

无论如何,每隔10秒对设备进行一次“ ping”检查对我们来说是解决问题的方法。


1
谢谢!好像我遇到了同样的问题。拔下并重新插入USB电缆会使设备显示在列表中。
Jorge Pedret 2014年

5

在电话中启用USB调试(设置=>开发人员选项)很有帮助。


1

我们的持续集成环境与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设备”并将其保持打开状态。



1

我只是想跟进胡安-德尔加多的出色建议。我在MacOS High Sierra上发现,adb使用该watch命令每10秒运行一次,也可以有效地解决此问题:

watch -n 10 adb -d devices

这使我可以回避创建.plist文件,但是明显的缺点是它不是永久性的解决方案。该watch命令在OSX的早期版本中可用,因此在那里也应有效。


我没有watch在macOS Catalina上安装,但可以使用轻松安装brew install watch
mokagio

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.