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