實作 USB HAL

Android 8.0 版本將 USB 指令的處理從init腳本移至本機 USB 守護程式中,以實現更好的配置和程式碼可靠性。對於小工具功能配置, init腳本(屬性觸發器)用於執行特定於裝置的小工具操作。

在先前的版本中,這些特定於設備的配置是透過特定於設備的init腳本(使用屬性觸發器)來實現的。轉向硬體抽象層 (HAL) 設計會帶來更簡潔的實現,從而解決以下問題:

  1. 諸如寫入核心 sysfs 節點之類的操作可能會失敗,但不會傳播回設定屬性觸發器的框架程式碼。因此,框架錯誤地認為操作已成功,即使它們默默地失敗了。
  2. init腳本可以執行的操作數量有限。

Android 12 版本增加了網路控制模型 (NCM) 的 USB Gadget HAL 支援以及傳回 HAL 版本號和 USB 速度的 API 呼叫。有關透過 USB HAL 提供的 API 呼叫的更多信息,請參閱android.hardware.usb套件摘要

HAL 和高音

裝置特定的init腳本被用作 HAL 層的替代,以執行裝置特定的 USB 操作。 USB(透過 ADB)是調試系統問題的主要介面。使用本機守護程式來執行 USB 配置可以消除對框架程式碼的依賴,因此即使框架崩潰,USB 也應該運行。

在 Android 8.0 中引入的Treble模型下,所有 HAL 都與系統服務隔離,並且需要在自己的本機守護程序中運行。這消除了對專用 USB 守護程序的要求,因為 HAL 層可以很好地兼作 USB 守護程序。

預設的 HAL 實作適用於所有 Android 8.0 之前的裝置。因此,對於 Android 8.0 之前的設備,不會有任何特定於設備的工作。 Android 8.0使用HAL介面來查詢USB連接埠的狀態並執行資料角色和電源角色交換。

執行

新的 USB HAL 介面需要在運行 Android 8.0 的每台裝置上實現。預設實作應該照顧 Android 8.0 之前的裝置。如果裝置使用dual_role_usb類別報告 type-c 連接埠狀態,則預設實作就足夠了。可能需要在裝置特定的 USB 腳本中進行一些細微的更改,才能將 typec-c 節點的所有權轉移到系統。