Android 模拟器 USB 直通失败:“‘usb-host’不是有效的设备型号名称”

Bat*_*bix 4 windows android android-studio

当我尝试按照https://androidstudio.googleblog.com/2020/08/emulator-30024-canary.html中所述使用 USB 直通时,

emulator -avd Pixel_3a_API_30_x86 -qemu -usb -device usb-host,vendorid=076B,productid=3821

我收到错误消息'usb-host' is not a valid device model name。根据 Google 链接,模拟器版本 30.0.24 应该支持 USB 直通,我的模拟器报告版本 30.5.3.0 (build_id 7196367)。

有没有人成功地让它发挥作用?

New*_*Bit 8

不!与 Android 模拟器版本 30.5.4.0 (build_id 7243153) 相同。

如果我查看 Linux 版本的 qemu 模拟器文件的二进制文件,
我仍然可以找到 usb-host 选项。但在 Windows 版本中它被完全遗漏了。
所以我猜 Google 一定已经关闭了 Windows 中的 USB 主机支持。
不幸的是,模拟器的最新发行说明是从30.4.5(2021 年 2 月 23 日)开始的

另外,我在android-review AOSP中找不到任何关于此的提示, 不知道还能去哪里查看!?

[更新:]
我想我已经在 GitHub AOSP Mirror 和android-review AOSP上找到了它。Erwin Jansen 于 3 月 3 日承诺:

恢复“为 Windows 启用 USB 主机重定向”

# Libusb support on windows is not what we would like it to be
LIBUSB_FLAGS="--disable-libusb --disable-usb-redir"
Run Code Online (Sandbox Code Playgroud)

Windows 上的 USB 直通功能似乎有太多问题。
因此,如果回到版本 30.5.2 (build_id 7175973)(2021 年 2 月 27 日),
usb-host 仍然是有效的设备型号名称。
DL 是从加那利海峡拍摄的。

但看起来谷歌仍在努力......

[更新 10.12.21]
自模拟器版本 31.1.4 起,google 实现了一些新功能和工具来传递 USB。我无法使用 emulator -help 找到-list-usb参数,但如果运行以下命令,它就可以工作:

emulator -list-usb
VID:PID 058f:6387 (Bus 1, Port 5.1.1)
        Manufacturer:
        Product:
        SerialNumber:   40A0FE0A
Run Code Online (Sandbox Code Playgroud)

有了这些信息,您就可以使用-usb-passthrough参数
(-usb-passthroughvendorid=VID,productid=PID[,hostbus=BUS,hostport=PORT])

emulator -netdelay none -netspeed full -avd Pixel_4_API_31 -usb-passthrough vendorid=058f,productid=6387,hostbus=1,hostport=5.1.1
Run Code Online (Sandbox Code Playgroud)

但它显示错误:

ERROR   | Cannot load Android USB Assistant Driver for USB device "vendorid=058f". USB pass-through might not work.
Run Code Online (Sandbox Code Playgroud)

谷歌再次添加了一个新工具,带有用于 USB 直通的预构建 Windows 驱动程序,人们可以再次尝试。可直接从AOSP (tgz)下载

以管理员身份运行:

Install_Drivers.bat
Run Code Online (Sandbox Code Playgroud)
Installing Android USB Assistant...
call Android_USB_Assistant_Install.bat
Microsoft PnP Utility

Processing inf :            Android_USB_Assistant.inf
Successfully installed the driver.
Driver package added successfully.
Published name :            oem89.inf


Total attempted:              1
Number successfully imported: 1

Installing Android Emulator USB Passthrough Assistance Driver

SERVICE_NAME: UsbAssist
        TYPE               : 1  KERNEL_DRIVER
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
[SC] DeleteService SUCCESS

SERVICE_NAME: UsbAssist
        TYPE               : 1  KERNEL_DRIVER
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 0
        FLAGS              :
Run Code Online (Sandbox Code Playgroud)

但再次尝试,仍然显示相同的错误。

[21.12.13更新]
现在可以使用了。正确的语法是使用0x并且不使用 usbhost 和 usbport 关键字:

-usb-passthrough vendorid=0x058f,productid=0x6387
Run Code Online (Sandbox Code Playgroud)

它仍然显示错误消息:

qemu-system-x86_64.exe: libusb_kernel_driver_active: -12 [NOT_SUPPORTED]
Run Code Online (Sandbox Code Playgroud)

并且该设备在 AVD 中无法识别,但是一旦您使用来自 Github 的脚本rootAVD并使用参数PATCHFSTAB GetUSBHPmodZ来 root AVD(Magisk Canary)

rootAVD.bat %LOCALAPPDATA%\Android\Sdk\system-images\android-32\google_apis_playstore\x86_64\ramdisk.img PATCHFSTAB GetUSBHPmodZ
Run Code Online (Sandbox Code Playgroud)

并安装我的 usbhostpermissions.zip Magisk 模块,USB 驱动器将在系统范围内显示为驱动器,并且可以通过 USB 串行终端 Apk 访问 USB 串行设备。APK USB 设备信息现在还将显示已连接的 USB 设备。我会尽快更新我的XDA 指南。

为了传递更多 USB 设备,只需在第一个 USB 设备后面添加另一个即可:

emulator -netdelay none -netspeed full -avd Pixel_4_API_32 -usb-passthrough vendorid=0x058f,productid=0x6387 -usb-passthrough vendorid=0x067b,productid=0x2303
Run Code Online (Sandbox Code Playgroud)