轉換 HAL 模組

您可以透過轉換 hardware/libhardware/include/hardware 中的標頭,將現有的 HAL 模組更新為 HIDL HAL 模組。

使用 c2hal

c2hal工具會處理大部分的轉換作業,減少所需的手動變更次數。舉例來說,如要為 NFC HAL 產生 HIDL .hal 檔案,請執行下列指令:

make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h

這些指令會在 hardware/interfaces/nfc/1.0/ 中新增檔案。從 $ANDROID_BUILD_TOP 目錄執行 hardware/interfaces/update-makefiles.sh,也會將必要的 makefile 新增至 HAL。您可以在這裡手動變更,完全轉換 HAL。

c2hal 活動

執行 c2hal 時,標頭檔案中的所有內容都會轉移至 .hal 檔案。

c2hal 會識別所提供標頭檔案中包含函式指標的結構體,並將每個結構體轉換為個別介面檔案。舉例來說,alloc_device_t 會轉換為 IAllocDevice HAL 模組 (位於 IAllocDevice.hal 檔案中)。

所有其他資料類型都會複製到 types.hal 檔案。 井號定義會移至列舉,而並非 HIDL 的項目或無法轉換的項目 (例如靜態函式宣告) 會複製到標示「NOTE」的註解中。

手動活動

c2hal 工具遇到特定建構時,不知道該怎麼做。舉例來說,HIDL 沒有原始指標的概念,因此當 c2hal 在標頭檔案中遇到指標時,不知道該將指標解讀為陣列,還是參照另一個物件。同樣地,虛空指標也不透明。

轉換至 HIDL 時,必須手動移除 int reserved[7] 等欄位。例如,應將傳回值的名稱更新為更有意義的名稱;舉例來說,在 NFC 中,應將 write 等方法的傳回參數從自動產生的 int32_t write_ret 轉換為 Status status (其中 Status 是包含可能 NFC 狀態的新列舉)。

實作 HAL

建立代表 HAL 的 .hal 檔案後,您必須產生 makefile (Make 或 Soong),在 C++ 和 Java 中建立語言支援 (除非 HAL 使用 Java 不支援的功能)。./hardware/interfaces/update-makefiles.sh 指令碼可自動為 hardware/interfaces 目錄中的 HAL 生成 makefile (如為其他位置的 HAL,只要更新指令碼即可)。

確認 makefile 為最新版本後,即可產生標頭檔案並實作方法。如要瞭解如何實作產生的介面,請參閱 HIDL C++ (適用於 C++ 實作) 或 HIDL Java (適用於 Java 實作)。