原文链接:https://fabiensanglard.net/android_windows_driver/index.html
未经许可,禁止转载!

作者 | FABIEN SANGLARD 译者 | 弯月在 Android 平台涌现的早期,利用 Linux 和 Mac OS X 的 Android 开拓职员只须要一根 USB 线就可以连接他们的设备,而 Windows 用户则须要探求并安装驱动程序,非常繁琐。当你将设备插入到 USB 端口时,操作系统须要加载其接口的驱动程序。为此,操作系统须要检讨 USB 描述符的层次构造。常日情形下,只需读取设备描述符的厂商 ID(VID)和产品 ID(PID),就足以确定应加载哪些驱动程序。三大主流操作系统内置了“默认”的设备类驱动程序,因此大多数 USB 设备都能够自动安装。举个例子,当连接 ErgoDox EZ 键盘时,Windows 会加载 hidusb.sys,而不须要用户安装驱动程序。如果 Windows 找不到内置的设备类驱动程序(或者有更好的匹配项),则会加载用户安装的驱动程序。例如,苹果 Magic Trackpad 也会获取 hidusb.sys,但如果安装了 Bingxing Wang 的驱动程序,那么 Windows 就会加载 AmtPtpDeviceUm.dll(支持右键单击和多指手势)。如果找不到驱动程序,Linux 将加载 usbfs,这样用户空间程序也可以访问设备。Mac OS 也是如此,只不过利用的是 IOKit;而 Windows 会报错,即没有加载驱动程序,就无法访问 Android 设备。为相识释在安装驱动程序时发生了什么,我们来看看 Google USB Driver 的“核心”文件:android_winusb.inf。INF 文件指示:“当 VID=0x18D1 且 PID=0x4E11(即Google Nexus One)时,加载 winusb 驱动程序”。WinUSB 是什么?类似于 Linux 的 usbfs 和 Mac OS 的 IOKit,它是一种 USB 驱动程序,许可用户空间程序列举接口,并在端点之间进行读/写。这便是 adb(Android 调试桥)用来与 Android 设备通信的办法。为什么 Android 设备不再须要 Windows 驱动程序前面描述的方法有一个明显的毛病。如果 Android 设备的 VID/PID 未列出,winusb 将不会加载。Windows 8 有一种比 INF 文件更好的方法来确定接口须要哪个驱动程序。它可以直接讯问设备!
当连接设备时,操作系统发出 String Descriptors 要求,索引为 0xEE。如果设备与微软操作系统描述符(MOD)兼容,则返回字符串 M\0S\0F\0T\01\000\0\0。在这种情形下,Windows 会要求扩展兼容 ID OS 特色描述符。我们可以利用 Pixel 6 上的 libusb 的 xusb 检讨此描述符。该设备已设置为启用媒体传输协议和开拓者模式。此特色描述符会指示这两个接口须要哪个驱动程序:第一个接口利用 mtp.sys,第二个接口利用 winusb.sys。加载 winusb.sys 后,用户空间可实行文件(如 adb)就可以打开设备,声明接口,然后开始开拓事情。不再须要驱动程序!
我看了看我收藏的 Pixel 系列设备,彷佛微软操作系统描述符支持始于 Pixel 2(2017年)和 Pixel 3a(2019年)之间(抱歉,我没有 Pixel 3 可以测试)。Pixel 8 这类的新设备具有扩展属性操作系统特色描述符,包含 GUID、帮助页面、URL 乃至图标。