相機 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

相機HAL3特點

Android相機API重新設計的目的是大幅提高應用程式控制Android裝置上相機子系統的能力,同時重新組織API以使其更有效率和可維護。額外的控制使得在Android 裝置上建立高品質的相機應用程式變得更加容易,這些應用程式可以在多個產品上可靠地運行,同時仍然盡可能使用裝置特定的演算法來最大限度地提高品質和效能。

相機子系統的版本 3 將操作模式建構成單一統一視圖,可用於實現先前的任何模式和其他幾種模式,例如突發模式。這使得使用者可以更好地控制焦點和曝光以及更多的後處理,例如降噪、對比度和銳化。此外,這種簡化的視圖使應用程式開發人員可以更輕鬆地使用相機的各種功能。

該 API 將相機子系統建模為管道,以 1:1 的方式將傳入的幀捕獲請求轉換為幀。這些請求封裝了有關幀捕獲和處理的所有配置資訊。這包括解析度和像素格式;手動感應器、鏡頭和閃光燈控制; 3A工作模式; RAW->YUV處理控制;統計數據生成;等等。

簡單來說,應用程式框架向相機子系統要求幀,然後相機子系統將結果返回輸出流。此外,也會為每組結果產生包含色彩空間和鏡頭陰影等資訊的元資料。您可以將相機版本 3 視為相機版本 1 的單向流的管道。它將每個捕獲請求轉換為感測器捕獲的一張影像,該影像被處理為:

  • 包含有關捕獲的元資料的結果物件。
  • 一到 N 個影像資料緩衝區,每個緩衝區都有自己的目標表面。

可能的輸出表面集是預先配置的:

  • 每個表面都是固定解析度的影像緩衝區流的目的地。
  • 一次只能將少量表面配置為輸出 (~3)。

請求包含所有所需的擷取設定以及要為此請求推送影像緩衝區的輸出表面清單(在總配置集中)。請求可以是一次性的(使用capture() ),也可以無限重複(使用setRepeatingRequest() )。捕獲優先於重複請求。

相機資料模型

圖1. Camera核心運行模型

相機 HAL1 概述

相機子系統的版本 1 被設計為具有高級控制和以下三種操作模式的黑盒子:

  • 預覽
  • 錄影
  • 靜止捕捉

每種模式都有略微不同且重疊的功能。這使得很難實現新功能,例如介於兩種操作模式之間的突發模式。

相機框圖

圖 2.相機組件

Android 7.0 繼續支援相機 HAL1,因為許多裝置仍然依賴它。此外,Android 相機服務支援實現兩個 HAL(1 和 3),當您想要使用相機 HAL1 支援功能較弱的前置相機和使用相機 HAL3 的更高級的後置相機時,這非常有用。

有一個相機HAL模組(有自己的版本號),它列出了多個獨立的相機設備,每個設備都有自己的版本號。相機模組 2 或更高版本需要支援裝置 2 或更高版本,而此類相機模組可以混合使用相機裝置版本(這就是我們說 Android 支援實現兩個 HAL 的意思)。