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>
。