舊版 HAL

HAL 為硬體供應商定義要實作的標準介面 這可讓 Android 無法辨識較低層級的驅動程式實作。 使用 HAL 可讓您在不影響或修改的情況下實作功能 也就是第三層本頁說明舊版架構, 。如果您使用 Android 8.0 以上版本,請參閱 HAL 總覽

HAL 元件

圖 1. HAL 元件

您必須針對範本中的 硬體需求HAL 實作通常是內建於 共用程式庫模組 (.so 檔案),但由於 Android 不會強制要求 HAL 實作與裝置驅動程式之間的標準互動 做出最合適的解決方式不過,如要讓 Android 系統 才能與硬體進行互動,您必須遵守 合約定義。

為了確保 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。A 罩杯 少數子系統 (包括 Wi-Fi、無線電介面層和藍牙) 有其他非標準化 `libhardware_legacy` 中的介面,或在整個程式碼集中交錯。從未儲存舊版 HAL 則能確保穩定性