轉換 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]之類的字段。返回值的名稱等項目應該更新為更有意義的東西;例如,將諸如write in NFC 等方法的返回參數從自動生成的int32_t write_retStatus status (其中Status是包含可能的 NFC 狀態的新枚舉)。

實施 HAL

在創建.hal文件來表示 HAL 之後,您必須生成在 C++ 和 Java 中創建語言支持的 makefile(Make 或 Soong)(除非 HAL 使用 Java 中不支持的功能)。 ./hardware/interfaces/update-makefiles.sh腳本可以自動為位於hardware/interfaces目錄中的 HAL 生成 makefile(對於其他位置的 HAL,只需更新腳本)。

當 makefile 是最新的時,您就可以生成頭文件並實現方法了。有關實現生成的接口的詳細信息,請參閱HIDL C++ (用於 C++ 實現)或HIDL Java (用於 Java 實現)。