HAL 為硬件供應商定義了一個標準接口來實現,這使 Android 能夠對較低級別的驅動程序實現不可知論。使用 HAL 允許您在不影響或修改更高級別系統的情況下實現功能。本頁介紹了從 Android 8.0 開始不再支持的舊架構。對於 Android 8.0 及更高版本,請參閱HAL 類型。
![HAL 組件](https://source.android.com/static/devices/images/ape_fwk_hal.png?authuser=7&hl=zh-tw)
圖 1. 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>
。