HAL 為硬件供應商定義了一個標準接口來實現,這使 Android 能夠對較低級別的驅動程序實現不可知論。使用 HAL 允許您在不影響或修改更高級別系統的情況下實現功能。本頁介紹了從 Android 8.0 開始不再支持的舊架構。對於 Android 8.0 及更高版本,請參閱HAL 類型。
您必須為您的產品提供的特定硬件實現相應的 HAL(和驅動程序)。 HAL 實現通常內置在共享庫模塊( .so
文件)中,但由於 Android 不要求 HAL 實現和設備驅動程序之間進行標準交互,因此您可以根據自己的情況做最好的事情。但是,為了使 Android 系統能夠正確地與您的硬件交互,您必須遵守每個特定於硬件的 HAL 接口中定義的協定。
為了保證 HAL 具有可預測的結構,每個特定於硬件的 HAL 接口都具有定義在hardware/libhardware/include/hardware/hardware.h
中的屬性。此接口允許 Android 系統以一致的方式加載正確版本的 HAL 模塊。 HAL 接口由兩個組件組成:模塊和設備。
HAL 模塊
模塊代表您打包的 HAL 實現,它存儲為共享庫( .so file
)。 hardware/libhardware/include/hardware/hardware.h
頭文件定義了一個結構( hw_module_t
),它表示一個模塊並包含元數據,例如模塊的版本、名稱和作者。 Android 使用此元數據來正確查找和加載 HAL 模塊。
此外, hw_module_t
結構包含指向另一個結構hw_module_methods_t
的指針,該結構包含指向模塊的打開函數的指針。此開放函數用於啟動與 HAL 作為抽象的硬件的通信。每個特定於硬件的 HAL 通常使用該特定硬件的附加信息擴展通用hw_module_t
結構。例如,在相機 HAL 中, camera_module_t
結構體包含一個hw_module_t
結構體以及其他相機特定的函數指針:
typedef struct camera_module { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); } camera_module_t;
當您實現 HAL 並創建模塊結構時,您必須將其命名為HAL_MODULE_INFO_SYM
。來自 Nexus 9 音頻 HAL 的示例:
struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = AUDIO_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = AUDIO_HARDWARE_MODULE_ID, .name = "NVIDIA Tegra Audio HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, };
HAL 設備
設備抽象了您產品的硬件。例如,音頻模塊可以包含主音頻設備、USB 音頻設備或藍牙 A2DP 音頻設備。
設備由hw_device_t
結構表示。與模塊類似,每種類型的設備都定義了通用hw_device_t
的詳細版本,其中包含硬件特定功能的函數指針。例如, audio_hw_device_t
結構類型包含指向音頻設備操作的函數指針:
struct audio_hw_device { struct hw_device_t common; /** * used by audio flinger to enumerate what devices are supported by * each audio_hw_device implementation. * * Return value is a bitmask of 1 or more values of audio_devices_t */ uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); ... }; typedef struct audio_hw_device audio_hw_device_t;
除了這些標準屬性之外,每個特定於硬件的 HAL 接口都可以定義更多自己的特性和要求。有關詳細信息,請參閱HAL 參考文檔以及每個 HAL 的單獨說明。
構建 HAL 模塊
HAL 實現內置於模塊 ( .so
) 文件中,並在適當時由 Android 動態鏈接。您可以通過為每個 HAL 實現創建Android.mk
文件並指向您的源文件來構建您的模塊。通常,您的共享庫必須以特定格式命名,以便可以正確找到和加載它們。命名方案因模塊而異,但遵循以下一般模式: <module_type>.<device_name>
。