實作 USB HAL

Android 8.0 版本將 USB 指令的處理作業從 init 指令碼移至原生 USB 精靈,以提升設定和程式碼可靠性。在 Gadget 函式設定中,init指令碼 (屬性觸發條件) 用於執行裝置專屬的 Gadget 作業。

在先前的版本中,這些裝置專屬設定是透過裝置專屬的 init 指令碼 (使用屬性觸發條件) 達成。改用硬體抽象層 (HAL) 設計可大幅簡化實作程序,解決下列問題:

  1. 寫入核心 sysfs 節點等作業可能會失敗,但不會傳播回設定屬性觸發程序的架構程式碼。因此,即使作業無聲無息地失敗,架構仍會誤以為作業成功。
  2. init 指令碼可執行的作業數量有限。

Android 12 版本新增了 USB Gadget HAL 對網路控制模型 (NCM) 的支援,以及可同時傳回 HAL 版本號碼和 USB 速度的 API 呼叫。如要進一步瞭解透過 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 指令碼中進行微小變更, 將 type-c 節點的擁有權轉移給系統。