您可以通過轉換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_ret
為Status 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 實現)。