轉換 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 在標頭檔案中遇到指標時,它不知道指標應解讀為陣列,還是另一個物件的參照。同樣地,void 指標也是不透明的。

在轉換至 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 實作)。