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