您可以透過轉換 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 實作)。