我的手机通过 USB 连接到我的电脑。
使用查看设备信息时
sudo udevadm info --attribute-walk
产品和供应商 ID 显示正常,但没有ATTR{序列号}。我正在使用的应用程序(Android adb)需要设备报告序列号才能正常工作。
有什么方法可以伪造设备的序列号,例如使用 udev 规则?
澄清:问题不在于如何得到USB 设备的序列号,但如何放序列号。
我有一部 Android 手机,它不通过 USB 报告序列号,而且 adb 工具不太喜欢这个。到目前为止,似乎还没有任何简单的解决方案。然而,现在购买一部合适的 Android 手机进行开发是很容易的。
答案1
首先,确保未报告序列号的设备确实是问题所在。adb devices
如果没有权限访问 下的相应设备,会将序列号列为全问号/dev/bus/usb/
。另请记住 adb 会启动服务器,您可能需要终止该服务器才能重新探测。
假设确实是设备的问题,我赶紧检查了adb源代码。它出现register_device
在core/adb/usb_linux.c
直接从设备读取序列号时。core/adb/usb_libusb.c
调用libusb_get_device_descriptor
来执行此操作(检查 libusb 源代码)从 sysfs 或直接从设备获取它。所以不幸的是,任何 udev 技巧都无济于事。
您的选择似乎是:
- 弄清楚如何让 adb 在没有序列号的情况下工作。可能,修补
adb
(它是开源的)。我认为这对于 Stack Overflow 来说是一个更多的问题。 - 对内核 usbfs 驱动程序进行修补以伪造对 adb 请求的响应。这听起来比给我打补丁要困难得多。
- 修补内核以允许在 syfs 中伪造序列号,假设 adb 使用 libusb。
- 修复损坏的硬件。
答案2
如果您知道特定设备的设备节点(例如/dev/sdb),可以使用以下命令查找:
udevadm info -a -p $(udevadm info -q path -n /dev/sdb)
通常,如果您尝试在 /etc/udev/rules.d/51-android.rules 中为 Android 设备创建自定义规则,则lsusb
在终端中写入会显示类似 的内容Bus 002 Device 004: ID 062a:3270 Creative Labs
。 “ID”后面的四个字符(在本例中是)用于指示该文件中的062a
特定字符。idVendor
答案3
可能不是串行而是 FTDI,因此您可以尝试以下方法:
1)获取序列号
sudo udevadm info --attribute-walk -n /dev/ttyUSB0 | sed -n '/FTDI/,/serial/p'
2) 创建规则并用您找到的序列号或假序列号替换 XXXXXXXX
sudo echo 'SUBSYSTEM=="tty", ATTRS{serial}=="XXXXXXXX", GROUP="users", MODE="0660", SYMLINK+="myusbphone"' | sudo tee /etc/udev/rules.d/99-myusbphone.rules
3)重新加载规则
sudo udevadm control --reload-rules
。
在这种情况下,请尝试联系本文的作者文章。