Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

舊版HAL

HAL定義了供硬件供應商實施的標準接口,該接口使Android無需考慮底層驅動程序的實現。使用HAL可使您實現功能而不會影響或修改更高級別的系統。本頁介紹了較舊的架構,該架構從Android 8.0開始不再受支持。對於Android 8.0及更高版本,請參見HAL類型

圖1. HAL組件

您必須為產品提供的特定硬件實現相應的HAL(和驅動程序)。 HAL實現通常內置在共享庫模塊( .so文件)中,但是由於Android並未強制HAL實現與設備驅動程序之間進行標準交互,因此您可以根據自己的情況採取最佳措施。但是,要使Android系統能夠與您的硬件正確交互,您必須遵守每個特定於硬件的HAL接口中定義的合同。

為了確保HAL具有可預測的結構,每個特定於hardware/libhardware/include/hardware/hardware.h 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並創建模塊struct時,必須將其命名為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音頻設備或Bluetooth 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>