舊版 HAL

HAL 為硬件供應商定義了一個標準接口來實現,這使 Android 能夠對較低級別的驅動程序實現不可知論。使用 HAL 允許您在不影響或修改更高級別系統的情況下實現功能。本頁介紹了從 Android 8.0 開始不再支持的舊架構。對於 Android 8.0 及更高版本,請參閱HAL 類型

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的指針,該結構包含指向模塊的打開函數的指針。此開放函數用於啟動與 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>