HAL 定義了一個供硬體供應商實現的標準接口,這使得 Android 能夠不了解較低級別的驅動程式實現。使用 HAL 可讓您在不影響或修改更高等級系統的情況下實現功能。本頁面描述了較舊的架構,從 Android 8.0 開始不再支援該架構。有關 Android 8.0 及更高版本,請參閱HAL 概述。
![HAL組件](https://source.android.com/static/docs/core/architecture/images/ape_fwk_hal.png?authuser=19&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>
。