實作 USB HAL

Android 8.0 版本將 USB 指令的處理作業從 init 指令碼移至原生 USB 守護程序,以便改善設定和程式碼的可靠性。針對小工具函式設定,init 指令碼 (屬性觸發事件) 會用於執行裝置專屬的小工具作業。

在先前的版本中,這些裝置專屬設定是透過裝置專屬的 init 指令碼 (使用屬性觸發事件) 完成。改用硬體抽象層 (HAL) 設計後,實作方式會變得更簡潔,並解決以下問題:

  1. 寫入核心 sysfs 節點的作業可能會失敗,但不會移回設定屬性觸發條件的架構程式碼。因此,即使作業已悄悄失敗,架構仍會錯誤地假設作業已成功。
  2. init 指令碼包含可執行的作業數量有限。

Android 12 版本新增了 USB Gadget HAL 支援功能,可支援網路控制模型 (NCM) 和 API 呼叫,同時傳回 HAL 版本號碼和 USB 速度。如要進一步瞭解可透過 USB HAL 使用的 API 呼叫,請參閱 android.hardware.usb 套件摘要

HAL 和 Treble

使用裝置專屬的 init 指令碼做為 HAL 層的替代指令碼,以執行裝置專用的 USB 作業。USB (透過 ADB) 是偵錯系統問題的主要介面。使用原生 Daemon 執行 USB 設定,可消除對架構程式碼的依附性,因此即使架構發生當機,USB 仍可繼續執行。

在 Android 8.0 中也推出的 Treble 模型中,所有 HAL 都會與系統服務隔離,且必須在其原生守護程式中執行。這樣一來,就不需要使用專屬的 USB 守護程序,因為 HAL 層會同時充當 USB 守護程序。

預設的 HAL 實作項目會處理所有 Android 8.0 以下版本的裝置。因此,Android 8.0 以下版本的裝置不會有任何裝置專屬工作。Android 8.0 會使用 HAL 介面查詢 USB 埠的狀態,並執行資料角色和電源角色交換。

實作

凡是在 Android 8.0 中啟動的裝置,都必須實作新的 USB HAL 介面。 預設實作方式應可處理 Android 8.0 以下版本的裝置。如果裝置使用 dual_role_usb 類別回報 Type-C 通訊埠狀態,預設實作方式就足以應付。您可能需要在裝置專屬的 USB 指令碼中進行一些微小變更,才能將 typc-c 節點的擁有權轉移至系統。