STF [二次开发 STF] 对于 adb 断线问题的分析及解决方案

0x88 · 2017年06月29日 · 最后由 jack 回复于 2022年01月06日 · 4780 次阅读
本帖已被设为精华帖!

最近流行测试平台开发,当然 USB 问题是少不了的话题,论坛最近都在讨论 USB 断线问题,我也曾经为此烦恼过一阵时间,但现在已经有比较稳定的解决方案。

首先,我们先来了解一下 USB 线。把一条 USB 线剪了,我们会看到里面只有 4 根线,这 4 根线两线做传输数据(RX,TX),另外两条做的就是供电(+,-)。USB 供电一般为 5 伏/1.5A,现在手机充电器为了提高充电效率把功率加大,因此一般的充电器都标注 5V/2.5A。
另外,USB2.0 的理论传输速度为 60MB/s,USB3.0 的则是 625MB/s。

了解了这些以后,聊聊 USB 遇到的一些问题吧。
1、手机 usb 连接啥都没有做每天都会不定时的断开...
2、批量安装应用的时候也会断开...
3、多台设备查看日志的时候一堆断开。
................................(欢迎补充)
usb 各种花式断线,各种报警,各种维护。

我曾经做过 usb 无线 wifi 方案,深刻了解到的 usb-hub 供电不靠谱,电压会各种被拉低,当电压低于 4.85V 时 USB 协议会呈现出各种奇怪的问题,完全无法解释。因此 USB-HUB 一定要外置供电!!!
另外 STF 开发者真的是个牛 B 的一群人,他们的经验很丰富,而且在官网上面写个很清楚。好多二次开发者都不往下看的,他们已经提供了解决思路,然后我发现我之前对于 USB 的瞎 BB 在牛人面前都是扯蛋,他们开发 STF 同样也遇到了这些问题,他们应该做过大量的测试,也有了相应解决方法,所以才选择 ubuntu 上面运行 STF 平台!
https://github.com/openstf/stf#troubleshooting


看不懂英文的同鞋,自行 google 翻译。算了我还是翻译一张图片吧。

上面问题描述已经很详细了吧,我也就不多解释了。

下面我讲一下在二次开发中遇到的一些问题及解决方案吧。
1、USB-HUB 选型
我一开始选择的是 USB3.0 的 HUB 叫阿卡西斯这一款,后来接入手机设备多了以后发现真的很不稳定。看了 STF 官网上面的说 ADB 在 USB2.0 运行会比较稳定,于是我再次选型 USB-HUB 后决定买 ORICO 这个牌子的,型号好像叫 P10-U2 吧,10 口 USB-HUB,价格 148 大元,只有 USB2.0 的传输协议。
2、USB 外置供电问题
ORICO 的 USB-HUB 使用的是 12V 转 5V 的供电,电流为 2.5A。但 USB-HUB 10 口满负荷,的运行过一段时间,发现某台一起连接的手机还是存在随机掉线的情况,于是我一个一个减少 USB 连接数,10 个/9 个/8 个...直接到 6 个,已经相对稳定了。但我还是怀疑一个 USB-HUB 接上多台手机只有 2.5A,功率是否足够?于是我就拜托公司的硬件工程师定制一个独立供电模块,他找了一个超大功率的直流电源 DIY,做了一个很漂亮的一个电源。目前供电非常稳定,专业的事情还是得找专业的人来做。

PS:现在硬件上的问题基本上已经解决了。

3、软件层面上的问题。
批量安装应用会掉线的问题,当时批量指的是 30 台手机同时安装应用。上面我说过 USB2.0 传输速度只有 60MB/s,是吧。因此批量安装一个 20MB 的 APK 包,20MB X N 台手机,这个流量相当的大,肯定超过 USB 理论传输速度,然后 USB 就会断开,断开!!!于是在开发代码上做了队列安装,一台一台安装。于是这个问题也解决了。

4、还未解决的一些手机
GOOGLE nexus:接上电源会一直掉电,直到电池没电....找问题找了很久,我司硬件工程师的分析可能是因为 nexus 电源模块损坏了导致被其它手机当成电源拉电。因此这台手机接一个 USB-HUB 很奢侈....
华为 V9:这个手机我也纳闷,在指定的 USB-HUB 上面就一定会断开连接,换到别的 USB-HUB 上就不会....问题没找到,一直很烦恼这台手机,感觉就是我不想跟这些破手机在一起,我是高大上的 V9.😅

共收到 39 条回复 时间 点赞
思寒_seveniruby 将本帖设为了精华贴 06月29日 22:22

 补充一个 usb 连接后可能找不到手机的问题,首先运行 android reset adb,会在/Users/yourname/.android/文件夹生成一个 android_usb.ini 的文件。 然后在设备管理那里,打开 android 手机的驱动信息 - 详细信息 - 硬件 id,查看手机的 usb\vid_xxxx 这个信息,这个 xxxx 就是设备的 vid,把这个 vid 加到上述的 android_usb.ini 上面,例如华为手机是 12d1,那么就加一行 0x12d1 在上面,然后运行 adb kill-server, adb devices 就能看到手机了。
之前兼容性调试的时候遇到过这种问题,查了好久才解决~~

0x88 #3 · 2017年07月04日 Author
water 回复

我这边使用的 stf 那套分布式方案,所以是不能重启 ADB。我要保证连接上的手机一定是稳定的,不会出现掉线的问题。目前在 ubuntu 上面没有出现过识别不了手机 serial 的情况。你可以试下 ubuntu 看会不会出现这种问题。在我的 windows 上面也会出现识别不了手机的情况出现,我记得好像是 adb 1.0.31 版本。后面换成新的 1.0.39 版本就不出现了。我之所以发这篇文章目的就是想说没必要去重启 ADB 或者是 USB。

0x88 回复

adb1.0.39 的确没试过~~

介绍的很详细,赞。

楼主 遇到过 使用 模拟器 链接 无响应的 问题不

0x88 #7 · 2017年07月07日 Author
王争伟 回复

为什么要使用模拟器?模拟器有序列号?

可以 较快的 切换 手机 分辨率 吧 ,不用找 各分辨率的 手机了

0x88 #9 · 2017年07月07日 Author

那你做 STF 也失出了它的意义。不建议这样做。另外模拟器没有序列号!

楼主硬件知识棒棒的
海淘了 stf 推荐的那款 hub,还是蛮稳定的~

0x88 #11 · 2017年07月11日 Author
laurasong 回复

海淘的都是有钱人啊,我因为海淘不起才选择 ORICO,虽然也很贵。

laurasong 回复

给个海淘,地址。。。

如果多个手机每个手机有多个安装 apk,当有一个手机第一次推送断开了,接下来这个手机还会自动接受接下来推送么

0x88 #14 · 2018年04月24日 Author
唐明龙 回复

如果不是因为超过通讯带宽的话,一般不会断开,应该说比较稳定,但如果超过带宽,你整台子服务器的手机都会断开,而不是一台。

也是用的 ORICO,尝试了 2 级级联 (1 个 Hub 上再连一个 Hub),稳定性可以接受。

0x88 #16 · 2018年05月03日 Author
Kun 回复

不建议这么干,反正有多余的 USB 接口为什么不用。。。而且你这样接布线会很乱,当然如果设备就十来台就无所谓了。

你好,我的 provider 的设备,总是断开连接,一下都断开,然后自己又自动连接上,隔一段时间就断一次。

0x88 #18 · 2018年09月18日 Author
zhntester 回复

具体问题得具体分析,你先看下 syslog,看下硬件是否断开连接。然后得看下是否切换 usb 模式,还得看下你的 hub 接了几台手机,整个电脑接了几台手机。多试几次才能试出问题。感觉上你得先看系统日志。

stf 这几天刚接触,看到很多说 usb 连接的问题,我有个疑惑,adb 不是支持 WiFi 连接的方式吗?为什么没有考虑用 WiFi 连接的方式取代 usb 连接的方式?

0x88 #20 · 2018年11月01日 Author
测试生 回复

wifi 是可以的,但是我们为了避免上网和 adb 通讯间的冲突不考虑使用 wifi。而且手机数量上去了,占用 wifi 的带宽会影响到通讯质量。

0x88 回复

噢,原来如此。不过我又想到另外一个问题,所有手机都通过电脑的 usb(或接 hub)来进行 adb 通讯,充电的话也是通过电脑,中间有转换,比起直充会慢很多,这点是怎么解决的呢?

0x88 #22 · 2018年11月01日 Author

diy 一个大功率的充电模块,给每个 hub 充电。

最近也在看 stf,直接买了个 30 口的 HUB,结果发现连上手机后,adb 只能拿到 6 台手机;换了个 7 口的 HUB 也是。明天看看 BIOS 中有没有关于 3.0 的选项,再试试

而且有个神奇的现象,我先连 HUB 后,再连鼠标键盘,鼠键完全没反应;如果不用鼠键,手机一台一台连的话就能读到 8 台。不知大佬是否遇到过类似的情况?

0x88 #25 · 2018年12月28日 Author
啵板 回复

你的电脑主板总线都达不到 30 个 usbhub 的量,我之前买过 50 口的,没什么卵用。问题 2 很正常,驱动把总线带宽占完了,或者把电流拉完了。走 usb2.0。

0x88 回复

换了另一台 Win 实验,倒是得出硬件有限制这个结论;没了解过总线这块的知识,看来还要补很多东西

我这边用的技嘉 B85 的主板,BIOS 里没找到 3.0 的开关。今天把 adb 升到 1.0.40 了,用了 7 口的连了 7 台,接入的 USB2.0 口,电源用的 5V2A,始终不稳定;连 6 台的话就没问题。

0x88 #28 · 2018年12月30日 Author
啵板 回复

一般电脑最多一个口连 6 台,一台主机最多 18 台。限于我之前那些破电脑。

@0x88 能贴一下 STF 分布式部署的方案吗?链接什么的?

0x88 #30 · 2019年04月22日 Author
Byron 回复

这个问题有点宽,我已经没搞 STF,现在写一篇文章出来也只能凭记忆,所以不写。硬件部署:一台主机连接 3 个 HUB,第一个 hub 连接 6 手机,一个机柜一个自制电源模块、一个工业 wifi。应用部署:一台主服务器,应用 docker 是启的 Stf-server;stf 本身支持分布式,子服务器只需要 adb 是通的,在 server 启动的时候配置上子服务器的 ip 地址即可。

0x88 回复

好的,我找找文档

谢谢楼主分享,最近正在搭建 stf 系统,需要接 500+台手机,然后分享手机给各种自动化测试。目前不稳定,adb connect 后容易断开。

Linux 通过查询 dmesg 查询到,Not enough host controller resources for new device state.这个要怎么解决?

0x88 #34 · 2019年10月23日 Author
TD 回复

换电脑。

0x88 回复


我看这上面的连接数量是 79,实际上我的 Linux 上面只有不到 10 台的手机,而在线的只有 4 台,除了换电脑还有其他办法删除到未使用的设备吗?

usb 3.0 的手机连到 usb 2.0 hub 上,会有问题么?

这款 ORICO 10 口 hub,需要多大功率的电源,才可以稳定测试啊?

0x88 #38 · 2021年05月16日 Author

去淘宝找一下那种电源,功率越大越好,但需要保持电压 5.2V。你也可以这么算,10*5.2V*2A=104W。

大家有遇到这样的问题么,使用 minicap 传输一段时间图片后,adb devices 模式下,能看到该设备,但是对该设备执行 adb -s 设备号 shell 命令,就卡住了,无法进入 shell 模式。 实际结果也是无法对这台机器执行 adb 命令了。真的太奇怪了

易轻狂 回复

我也遇到过,adb devices 可以查看到设备,adb shell 会卡住。我都是物理插拔解决的。请问你这边有啥好的解决方法吗

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册