舊版 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>

舊版 HAL

舊版 HAL 這個術語泛指所有 Android 8.0 之前的 HAL(在 Android 8 中已棄用)。大部分 Android 系統介面(相機、音訊、感應器等)都在「hardware/libhardware/include/hardware」下定義,並且具有粗略的版本控制和大致穩定的 ABI。一些子系統(包括 Wi-Fi、無線電介面層和藍牙)在「libhardware_legacy」中或散佈在整個程式碼庫中具有其他非標準化介面。舊版 HAL 從未提供硬穩定性保證。