| You need to test… | Best method | Why | |------------------|-------------|-----| | HID barcode scanner (keyboard wedge) | Method 1 (Linux only) or Method 2 | HID is simple; USB/IP is overkill unless you're on Windows/macOS | | Custom USB bulk device (e.g., data logger) | Method 2 (USB/IP) | Reliable bulk transfers, works cross-platform | | USB-to-serial sensor | Method 3 (serial redirection) | Bypasses USB complexity entirely | | High-speed video (UVC webcam) | None – use a real device | Emulator lacks isochronous support. Don't waste time. | | USB audio interface | None – use real device | Same as above – emulator audio is virtualized separately |
Apple’s hypervisor framework does not support USB passthrough to QEMU easily. The best method on macOS is:
If you need reliable, cross-platform USB forwarding, stop fighting the emulator. Use USB/IP (USB over IP). This decouples the physical USB device from the emulator host.
How it works: You run a USB/IP server on your physical machine (or a Raspberry Pi). The Android emulator connects to that server over TCP/IP, and a custom kernel module (or userspace driver) presents the device as if it were locally attached.
Most developers know that ADB can forward TCP ports. But did you know that ADB can also forward USB devices? Sort of.