相機 HAL

Android 的相機硬體抽象層 (HAL) 會將 android.hardware.camera2 中的高階相機架構 API,連結至底層的相機驅動程式和硬體。從 Android 13 開始,相機 HAL 介面開發作業會使用 AIDL。Android 8.0 推出 Treble,將 Camera HAL API 切換為由 HAL 介面說明語言 (HIDL) 定義的穩定介面。如果您先前為 Android 7.0 以下版本開發過相機 HAL 模組和驅動程式,請注意相機管道有重大變更。

AIDL 相機 HAL

如果是搭載 Android 13 以上版本的裝置,相機架構會支援 AIDL 相機 HAL。相機架構也支援 HIDL 相機 HAL,但 Android 13 以上版本新增的相機功能僅適用於 AIDL 相機 HAL 介面。如要在升級至 Android 13 以上版本的裝置上實作這類功能,裝置製造商必須將 HAL 程序從使用 HIDL 相機介面遷移至 AIDL 相機介面。

如要瞭解 AIDL 的優點,請參閱「適用於 HAL 的 AIDL」。

實作 AIDL 相機 HAL

如需 AIDL 相機 HAL 的參考實作方式,請參閱 hardware/google/camera/common/hal/aidl_service/

AIDL 相機 HAL 規格位於下列位置:

對於遷移至 AIDL 的裝置,裝置製造商可能需要視程式碼結構,修改 Android SELinux 政策 (sepolicy) 和 RC 檔案。

驗證 AIDL 相機 HAL

如要測試 AIDL 攝影機 HAL 實作項目,請確保裝置通過所有 CTS 和 VTS 測試。Android 13 推出 AIDL VTS 測試, VtsAidlHalCameraProvider_TargetTest.cpp

Camera HAL3 功能

Android Camera API 重新設計的目標,是大幅提升應用程式控制 Android 裝置上攝影機子系統的能力,同時重整 API,使其更有效率且易於維護。這項額外控制項可讓您在 Android 裝置上輕鬆建構高品質的相機應用程式,在多種產品上穩定運作,同時盡可能使用裝置專屬演算法,盡量提升品質和效能。

攝影機子系統第 3 版將作業模式架構為單一整合檢視畫面,可用於實作任何先前的模式和多種其他模式,例如連拍模式。這樣一來,使用者就能更輕鬆地控制對焦和曝光度,並進行更多後製處理,例如降噪、對比和銳利化。此外,這個簡化檢視畫面可讓應用程式開發人員更輕鬆地使用相機的各種功能。

API 會將相機子系統模擬為管道,將傳入的影格擷取要求轉換為影格,比例為 1:1。要求會封裝擷取及處理影格的所有設定資訊。包括解析度和像素格式;手動感應器、鏡頭和閃光燈控制;3A 作業模式;RAW->YUV 處理控制;統計資料產生等等。

簡單來說,應用程式架構會向攝影機子系統要求影格,而攝影機子系統會將結果傳回輸出串流。此外,系統還會為每組結果產生中繼資料,其中包含色彩空間和鏡頭陰影等資訊。您可以將攝影機第 3 版視為攝影機第 1 版單向串流的管道。這項功能會將每項擷取要求轉換為感應器擷取的一張圖片,並處理成:

  • 包含擷取中繼資料的結果物件。
  • 1 到 N 個圖像資料緩衝區,每個緩衝區都位於各自的目的地表面。

系統會預先設定可能的輸出介面集:

  • 每個 Surface 都是固定解析度的圖像緩衝區串流目的地。
  • 一次只能將少數介面設為輸出 (~3)。

要求包含所有所需的擷取設定,以及要將圖片緩衝區推送至其中的輸出介面清單 (從設定的總數中選取)。要求可以是單次要求 (使用 capture()),也可以無限期重複 (使用 setRepeatingRequest())。擷取作業的優先順序高於重複要求。

攝影機資料模型

圖 1. 攝影機核心作業模式

Camera HAL1 總覽

第 1 版的攝影機子系統設計為黑箱,具有高階控制項和下列三種運作模式:

  • 預覽
  • 錄影
  • 擷取靜態影像

每個模式的功能略有不同,但也有重疊之處。這使得實作新功能變得困難,例如介於兩種運作模式之間的連拍模式。

攝影機方塊圖

圖 2. 攝影機元件

Android 7.0 仍支援 Camera HAL1,因為許多裝置仍依賴這項功能。此外,Android 相機服務支援實作 HAL (1 和 3),如果您想使用相機 HAL1 支援功能較弱的前置鏡頭,並使用相機 HAL3 支援功能較強大的後置鏡頭,這項功能就非常實用。

單一攝影機 HAL 模組 (具有專屬版本號碼) 會列出多個獨立攝影機裝置,每個裝置都有自己的版本號碼。如要支援裝置 2 以上版本,必須使用攝影機模組 2 以上版本,且這類攝影機模組可混用攝影機裝置版本 (這就是我們說 Android 支援實作兩種 HAL 的意思)。