谷歌致力於推進種族平等的黑人社區。 怎麼看。
本頁面由 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具有可預測的結構中,每個特定於硬件的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是動態鏈接時適當。您可以通過創建構建模塊Android.mk文件,為每個HAL實現指著你的源文件。在一般情況下,你的共享庫必須在一個特定的格式命名,使他們能夠發現並正確加載。命名方案略有不同從模塊至模塊,但如下的一般模式: <module_type>.<device_name>