我使用 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 下每次插拔后,文件名都会变化,我怎么固定这个参数呢?
1
zjb861107 2019-01-10 18:13:29 +08:00
|
2
zjb861107 2019-01-10 18:14:30 +08:00
如果我没理解错的话,应该是 adb 的问题。
所以参考上面提到的几种方案吧 |
3
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 ``` |
4
15399905591 OP @zjb861107 谢谢,确实是 adb 的问题,但是单独提供一个 adb 服务是没用的,因为每个 docker 容器里都会带一个 adb,而 usb 一但被某个容器连接了,其它容器的 adb 就无法调用
|
5
15399905591 OP @zbinlin 谢谢答复,但有个问题,我每次插拔以后,pid 都会变动,这样,我之前启动的容器就没办法连接到了
|
6
zbinlin 2019-01-11 11:34:08 +08:00
@15399905591 被次插都变?不可能吧,你这是什么设备的?把 lsusb 输出贴出来看下
|
7
15399905591 OP 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 就会变动 |
8
15399905591 OP |
9
zbinlin 2019-01-11 12:17:49 +08:00
如果只插有一个这种 USB 设备,可以把 pid 省略,如 `lsusb -d 12d1:`
|
10
15399905591 OP @zbinlin 我就是有很多设备,不可能每次插拔都去获取,我想把这个 ID 固定下来。
|
11
weyou 2019-01-11 13:44:51 +08:00 via Android
udev 建一条规则,做个 device symbol link 到 /dev
|
12
zjb861107 2019-01-11 15:34:44 +08:00
@15399905591 adb server 用 sorccu/adb 启动然后暴露 5037 端口,appium 容器和宿主机上都不要启动 adb server。
|
13
15399905591 OP @zjb861107 你这种方法的问题在于,appium server 的 adb 是写容器内部的,我得改 appium 的容器才行。
|
14
15399905591 OP @weyou 我试试看,谢谢了。
|
15
zjb861107 2019-01-11 16:49:00 +08:00
@15399905591 我倒是觉得,想生产环境使用这是必须的,一个容器只做一件事。
官方的示例只是供你参考,让你能够“一键”跑起来,具体自己使用还是要修改的。这方面也可以参考 openstf。 |
16
julyclyde 2019-01-13 09:58:17 +08:00
@15399905591 bus 几 device 几,是设备在电脑上的连接关系
后边 device 几才是 vid:pid |