實作 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 節點的擁有權轉移至系統。