相機

Android 相機 HAL 圖示

Android 的相機硬體抽象層 (HAL) 會連接較高等級的 相機架構 API 相機 2 到底層相機驅動程式和硬體。相機子系統 包含對相機管線元件實作,而相機 HAL 則適用 提供的介面,以用於實作您的 元件。

建築

下圖和清單說明 HAL 元件。

Android 相機架構

圖 1. 相機架構

應用程式架構
應用程式架構層級是應用程式的程式碼,會使用 Camera 2 API,用於與相機硬體互動。在內部,這個程式碼 呼叫 Binder 介面,以便存取與 相機上
AIDL
CameraService 相關聯的繫結器介面可 於 架構/av/camera/aidl/android/hardware 產生的程式碼會呼叫較低層級的原生程式碼,以取得 並傳回用於建立模型的 CameraDevice,最後 CameraCaptureSession 物件。
原生架構
位於 frameworks/av/ 中的這個架構提供了 相當於 CameraDevice CameraCaptureSession 類別其他參考資訊 NDK camera2 參考資料
繫結器處理序間通訊 (IPC) 介面
IPC 繫結器介面有助於跨程序邊界進行通訊。 有兩種相機繫結器類別 frameworks/av/camera/camera/aidl/android/hardware 目錄, 呼叫相機服務。 ICameraService 是相機服務的介面。 ICameraDeviceUser 是特定開啟的介面 相機裝置;和 ICameraServiceListener ICameraDeviceCallbacksCameraServiceCameraDevice 回呼 應用程式架構。
相機服務
攝影機服務,位於 frameworks/av/services/camera/libcameraservice/CameraService.cpp, 是與 HAL 互動的實際程式碼
HAL
硬體抽象層會定義要查詢的 而且您必須實作相機服務,才能使用攝影機 硬體功能

實作 HAL

HAL 位於相機驅動程式和高階 Android 架構之間 並定義必須實作的介面,才能讓應用程式正確運作 相機硬體HIDL 我們定義了相機 HAL 介面,請參閱 硬體/介面/攝影機的相機功能。

典型的繫結化 HAL 必須實作下列 HIDL 介面:

參照 HIDL 實作適用於 CameraProvider.cpp CameraDevice.cppCameraDeviceSession.cpp。 實作內容可納入仍在使用 舊版 API。 自 Android 8.0 起,相機 HAL 實作項目必須使用 HIDL API;使用 不支援舊版介面

輸入驗證

由於 HAL 能存取的資源與相機服務不同,因此 而且系統會將其視為安全邊界。這表示從相機服務傳遞的參數 視為不受信任和未經消毒的處理。防範可能讓攻擊者 提升權限或存取他們不打算存取的資料,相機 HAL 必須 驗證從相機服務傳遞至 HAL 的參數。包括檢查緩衝區 長度值位於允許範圍內,且在使用前和使用前,會先清理參數 並傳送至硬體或核心驅動程式

舊版 HAL 元件

本節將說明舊版 HAL 元件的架構,以及如何 實作 HAL在 Android 8.0 以上版本中實作相機 HAL 時必須使用 HIDL API。

架構 (舊版)

下圖和清單說明瞭舊版相機 HAL 元件。

Android 相機架構

圖 2. 舊版相機架構

應用程式架構
應用程式架構層級是應用程式的程式碼,會使用 android.hardware.Camera 用於與相機硬體互動的 API。在內部,這個程式碼會呼叫 對應的 JNI 黏合類別來存取與 相機上
JNI
android.hardware.Camera位於 frameworks/base/core/jni/android_hardware_Camera.cpp。這組代碼 呼叫低階的原生程式碼,取得實體相機的存取權 並傳回可用來建立 android.hardware.Camera 物件。
原生架構
frameworks/av/camera/Camera.cpp 中定義的原生架構 會提供與 android.hardware.Camera 類別。這個類別會呼叫處理序間通訊 (IPC) 取得相機服務存取權。
繫結器處理序間通訊 (IPC Proxy)
IPC 繫結器 Proxy 有助於跨程序邊界進行通訊。 相機繫結器類別共有三個 呼叫相機服務的 frameworks/av/camera 目錄。 ICameraService 是相機服務的介面。 ICamera 是特定開啟相機裝置的介面。 而 ICameraClient 是裝置的介面 應用程式架構。
相機服務
攝影機服務,位於 frameworks/av/services/camera/libcameraservice/CameraService.cpp, 是與 HAL 互動的實際程式碼
HAL
硬體抽象層會定義要查詢的 而且您必須實作相機服務,才能使用攝影機 硬體功能
核心驅動程式
相機的驅動程式與實際的相機硬體和 HAL 的實作。相機和驅動程式必須支援 YV12 和 NV21 圖片格式,可支援預覽相機圖片 包括螢幕與錄影功能

實作 HAL (舊版)

HAL 位於相機驅動程式和高階 Android 架構之間 並定義必須實作的介面,才能讓應用程式正確運作 相機硬體HAL 介面定義於 「hardware/libhardware/include/hardware/camera.h」和 hardware/libhardware/include/hardware/camera_common.h 個標頭檔案。

camera_common.h 定義了 camera_module,這是標準 以取得相機的一般資訊,例如相機 ID 和屬性 (包括前置鏡頭或 後置鏡頭)。

camera.h 包含的程式碼與 android.hardware.Camera。這個標頭檔案會宣告 camera_device 結構體,而該結構包含 camera_device_ops 結構體,內含指向實作函式的指標 HAL 介面如需相機參數的說明文件 設定,請參閱 frameworks/av/include/camera/CameraParameters.h。 這些參數是透過 HAL 中 int (*set_parameters)(struct camera_device *, const char *parms) 指向的函式來設定。

如需 HAL 實作範例,請參閱 Galaxy Nexus HAL (hardware/ti/omap4xxx/camera 版)。

設定共用資料庫

設定 Android 建構系統,以正確封裝 HAL 實作 至共用資料庫中,並建立 Android.mk 檔案:

  1. 建立 device/<company_name>/<device_name>/camera 目錄,包含程式庫的來源檔案。
  2. 建立 Android.mk 檔案來建立共用資料庫。確保 makefile 包含下列幾行:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    媒體庫的名稱必須是「camera.<device_name>」 (已自動附加 .so),以便 Android 正確載入 資源庫。範例請見 Galaxy Nexus 相機的 makefile, hardware/ti/omap4xxx/Android.mk

  3. 複製必要的功能 XML,藉此指定裝置具有相機功能 frameworks/native/data/etc 目錄中的檔案使用 裝置的 makefile例如,指定裝置有相機閃光燈,且 即可自動對焦,在裝置的 <device>/<company_name>/<device_name>/device.mk makefile:
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    如需裝置 makefile 範例,請參閱 device/samsung/tuna/device.mk

  4. 請在以下位置宣告攝影機的媒體轉碼器、格式和解析度功能: device/<company_name>/<device_name>/media_profiles.xmldevice/<company_name>/<device_name>/media_codecs.xml XML 檔案。詳情請參閱 將轉碼器提供給 架構
  5. 在裝置的 device/<company_name>/<device_name>/device.mk makefile 複製 media_profiles.xmlmedia_codecs.xml 檔案複製到適當位置:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. 如要在裝置的系統映像檔中加入「相機」應用程式,請在 裝置有 PRODUCT_PACKAGES 個變數 device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...