HAL 為硬體供應商定義要實作的標準介面 這可讓 Android 無法辨識較低層級的驅動程式實作。 使用 HAL 可讓您在不影響或修改的情況下實作功能 也就是第三層本頁說明舊版架構, 。如果您使用 Android 8.0 以上版本,請參閱 HAL 總覽。
![HAL 元件](https://source.android.google.cn/static/docs/core/architecture/images/ape_fwk_hal.png?authuser=19&hl=zh-tw)
圖 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>
。