相機 HAL

Android 的相機硬體抽象層 (HAL) 會將 android.hardware.camera2 中較高層級的相機架構 API 連結至基礎相機驅動程式和硬體。從 Android 13 開始,相機 HAL 介面開發作業會使用 AIDL。Android 8.0 推出了 Treble,將相機 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 的單向串流管道。它會將每個擷取要求轉換為感應器所擷取的單一圖片,並將該圖片處理成:

  • 結果物件,其中包含擷取畫面相關的中繼資料。
  • 一到 N 個圖片資料緩衝區,每個都會放入自己的目的地途徑。

系統會預先設定可能的輸出途徑:

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

要求包含所有所需的擷取設定,以及要將圖片緩衝區推送至此要求的輸出途徑清單 (從已設定的總組合中)。要求可以是一次性的 (使用 capture()),也可以無限重複 (使用 setRepeatingRequest())。擷取作業的優先順序高於重複要求。

相機資料模型

圖 1. 相機核心作業模式

相機 HAL1 總覽

相機子系統第 1 版的設計為黑盒子,具有高階控制選項和下列三種操作模式:

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

每種模式的功能略有不同,且部分功能重疊。這使得難以實作連拍模式等新功能,因為連拍模式介於兩種運作模式之間。

攝影機模塊圖

圖 2. 相機元件

Android 7.0 仍支援相機 HAL1,因為許多裝置仍仰賴這項功能。此外,Android 相機服務支援同時實作兩個 HAL (1 和 3),這在您想使用相機 HAL1 支援功能較少的前置鏡頭,以及使用相機 HAL3 支援功能較高的後置鏡頭時,非常實用。

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