HAL 會定義硬體供應商可實作的標準介面,讓 Android 不必瞭解較低層級的驅動程式實作方式。使用 HAL 可讓您導入功能,而不影響或修改高階系統。本頁說明舊版架構,自 Android 8.0 起已不再支援。如果是 Android 8.0 以上版本,請參閱 HAL 總覽。
圖 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 的指標,而 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> 的一般模式。