HAL定義了供硬件供應商實施的標準接口,該接口使Android無需考慮底層驅動程序的實現。使用HAL可使您實現功能而不會影響或修改更高級別的系統。本頁介紹了較舊的體系結構,該體系結構自Android 8.0起不再受支持。對於Android 8.0及更高版本,請參見HAL類型。

圖1. HAL組件
您必須為產品提供的特定硬件實現相應的HAL(和驅動程序)。 HAL實現通常內置於共享庫模塊( .so
文件)中,但是由於Android並未強制HAL實現與設備驅動程序之間進行標準交互,因此您可以根據自己的情況採取最佳措施。但是,要使Android系統能夠與您的硬件正確交互,您必須遵守在每個特定於硬件的HAL接口中定義的合同。
為了保證HAL具有可預測的結構,每個特定於hardware/libhardware/include/hardware/hardware.h
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並創建模塊struct時,必須將其命名為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音頻設備或Bluetooth 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>
。