舊版 HAL

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 實現,它存儲為共享庫( .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 從未提供硬性穩定性保證。