Linux 下 /dev/bus/usb 文件每次插拔会变动

2019-01-10 17:28:20 +08:00
 15399905591

我使用 appium 模拟手机操作,我找了个 appium 的 docker 镜像( https://github.com/appium/appium-docker-android), 我使用该该镜像,每个容器都需要使用--device 参数指定一个 USB 设备,这个参数其实是指定的 /dev/bus/usb 下的某个文件,如下:

docker run -d -p 4723:4723 --device /dev/bus/usb/XXX/YYY:/dev/bus/usb/XXX/YYY -v ~/.android:/root/.android --name device1 appium/appium

但是 /dev/bus/usb 下每次插拔后,文件名都会变化,我怎么固定这个参数呢?

3267 次点击
所在节点    问与答
16 条回复
zjb861107
2019-01-10 18:13:29 +08:00
zjb861107
2019-01-10 18:14:30 +08:00
如果我没理解错的话,应该是 adb 的问题。
所以参考上面提到的几种方案吧
zbinlin
2019-01-10 18:22:05 +08:00
首先你找到这个 USB 设备的 Vendor ID 和 Product ID,可以通过 `lsusb` 查看:

```sh
lsusb
```

输出:
```
Bus 002 Device 028: ID 0451:8046 Texas Instruments, Inc.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 05d5:624c Super Gate Technology Co., Ltd
Bus 001 Device 003: ID 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter
```

例如我要找到的这个设备是 `Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter`,则它的 VID 和 PID 分别是 `0bda`, `8178`。

然后这样指定就可以了:

```sh
docker run -d -p 4723:4723 --device $( \
lsusb -d 0bda:8178 | \
awk '{ \
vid=$2; pid=substr($4, 1, length($4) - 1); \
printf "/dev/bus/usb/%s/%s:/dev/bus/usb/%s/%s", vid, pid, vid, pid; \
}' \
) -v ~/.android:/root/.android --name device1 appium/appium
```
15399905591
2019-01-11 10:37:42 +08:00
@zjb861107 谢谢,确实是 adb 的问题,但是单独提供一个 adb 服务是没用的,因为每个 docker 容器里都会带一个 adb,而 usb 一但被某个容器连接了,其它容器的 adb 就无法调用
15399905591
2019-01-11 10:49:08 +08:00
@zbinlin 谢谢答复,但有个问题,我每次插拔以后,pid 都会变动,这样,我之前启动的容器就没办法连接到了
zbinlin
2019-01-11 11:34:08 +08:00
@15399905591 被次插都变?不可能吧,你这是什么设备的?把 lsusb 输出贴出来看下
15399905591
2019-01-11 11:39:51 +08:00
Bus 002 Device 068: ID 12d1:107e Huawei Technologies Co., Ltd.
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


这条信息,只要重新插拔,Bus 002 Device 068: ID 12d1:107e Huawei Technologies Co., Ltd.
Device 后面的 ID 就会变动
15399905591
2019-01-11 11:40:07 +08:00
zbinlin
2019-01-11 12:17:49 +08:00
如果只插有一个这种 USB 设备,可以把 pid 省略,如 `lsusb -d 12d1:`
15399905591
2019-01-11 13:35:28 +08:00
@zbinlin 我就是有很多设备,不可能每次插拔都去获取,我想把这个 ID 固定下来。
weyou
2019-01-11 13:44:51 +08:00
udev 建一条规则,做个 device symbol link 到 /dev
zjb861107
2019-01-11 15:34:44 +08:00
@15399905591 adb server 用 sorccu/adb 启动然后暴露 5037 端口,appium 容器和宿主机上都不要启动 adb server。
15399905591
2019-01-11 15:50:56 +08:00
@zjb861107 你这种方法的问题在于,appium server 的 adb 是写容器内部的,我得改 appium 的容器才行。
15399905591
2019-01-11 15:51:06 +08:00
@weyou 我试试看,谢谢了。
zjb861107
2019-01-11 16:49:00 +08:00
@15399905591 我倒是觉得,想生产环境使用这是必须的,一个容器只做一件事。
官方的示例只是供你参考,让你能够“一键”跑起来,具体自己使用还是要修改的。这方面也可以参考 openstf。
julyclyde
2019-01-13 09:58:17 +08:00
@15399905591 bus 几 device 几,是设备在电脑上的连接关系
后边 device 几才是 vid:pid

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/525757

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX