【CSDN 編者按】随着時間的推移,如今 Android 開發人員無需再通過 USB 驅動程式連接配接裝置了,這具體是怎麼做到的呢?
原文連結:https://fabiensanglard.net/android_windows_driver/index.html
未經允許,禁止轉載!
作者 | FABIEN SANGLARD 譯者 | 彎月
責編 | 夏萌出品 | CSDN(ID:CSDNnews)在 Android 平台出現的早期,使用 Linux 和 Mac OS X 的 Android 開發人員隻需要一根 USB 線就可以連接配接他們的裝置,而 Windows 使用者則需要尋找并安裝驅動程式,非常繁瑣。而如今,我們不再需要驅動程式了,這究竟怎麼回事?
USB 驅動程式 / OS 的基礎知識當你将裝置插入到 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 裝置。
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 甚至圖示。