Google 致力于为黑人社区推动种族平等。查看具体举措
此页面由 Cloud Translation API 翻译。
Switch to English

相機

Android Camera HAL圖標

Android的相機硬件抽象層(HAL)將Camera 2中的高級相機框架API連接到基礎相機驅動程序和硬件。相機子系統包括相機管線組件的實現,而相機HAL提供了用於實現這些組件版本的接口。

建築

下圖和列表描述了HAL組件。

Android相機架構

圖1.相機架構

應用框架
在應用程序框架級別是應用程序的代碼,它使用Camera 2 API與攝像頭硬件進行交互。在內部,此代碼調用相應的Binder接口以訪問與相機交互的本機代碼。
圖書館
CameraService關聯的活頁夾接口可以在frameworks / av / camera / aidl / android / hardware中找到 。所生成的代碼調用低級別的本機代碼,以獲得訪問權,則用於創建物理照相機和返回數據CameraDevice並最終CameraCaptureSession在框架級對象。
本機框架
駐留在frameworks/av/此框架提供了與CameraDeviceCameraCaptureSession類等效的本地功能。另請參見NDK camera2參考
活頁夾IPC接口
IPC綁定程序接口有助於跨過程邊界進行通信。在frameworks/av/camera/camera/aidl/android/hardware目錄中有幾個照相機綁定程序類,它們調用照相機服務。 ICameraService是相機服務的接口; ICameraDeviceUser是特定打開的攝像頭設備的接口;和ICameraServiceListenerICameraDeviceCallbacks分別是應用程序框架的CameraServiceCameraDevice回調。
攝影服務
相機服務位於frameworks/av/services/camera/libcameraservice/CameraService.cpp ,是與HAL交互的實際代碼。
哈爾
硬件抽象層定義了相機服務調用的標準接口,您必須實施該標準接口才能使相機硬件正常工作。

實施HAL

HAL位於攝像頭驅動程序和更高級別的Android框架之間,並定義了必須實現的接口,以便應用程序可以正確操作攝像頭硬件。相機HAL的HIDL接口在hardware / interfaces / camera中定義。

典型的綁定HAL必須實現以下HIDL接口:

參考HIDL實現可用於CameraProvider.cppCameraDevice.cppCameraDeviceSession.cpp 。該實現包裝仍使用舊API的舊HAL。從Android 8.0開始,Camera HAL實現必須使用HIDL API。不支持使用舊版界面。

舊版HAL組件

本節描述了舊版HAL組件的體系結構以及如何實現HAL。如上所述,Android 8.0及更高版本上的Camera HAL實現必須改用HIDL API。

建築(舊版)

下圖和列表描述了舊相機HAL組件。

Android相機架構

圖2.傳統相機架構

應用框架
在應用程序框架級別是應用程序的代碼,它使用android.hardware.Camera API與攝像頭硬件進行交互。在內部,此代碼調用相應的JNI膠水類以訪問與相機交互的本機代碼。
傑尼
android.hardware.Camera關聯的JNI代碼位於frameworks/base/core/jni/android_hardware_Camera.cpp 。此代碼調用較低級別的本機代碼以獲得對物理相機的訪問權,並返回用於在框架級別創建android.hardware.Camera對象的數據。
本機框架
frameworks/av/camera/Camera.cpp定義的本機框架提供了與android.hardware.Camera類等效的本機框架。此類調用IPC活頁夾代理以獲取對攝像機服務的訪問。
活頁夾IPC代理
IPC活頁夾代理有助於跨過程邊界進行通信。位於frameworks/av/camera目錄中的三個照相機綁定程序類可調用照相機服務。 ICameraService是接口的攝像頭服務, ICamera是接口到一個特定的打開攝像裝置,並ICameraClient是設備的接口回到應用程序框架。
攝影服務
攝影機服務位於frameworks/av/services/camera/libcameraservice/CameraService.cpp ,是與HAL交互的實際代碼。
哈爾
硬件抽象層定義了相機服務調用的標準接口,並且必須實現該標準接口才能使相機硬件正常工作。
內核驅動
攝像機的驅動程序與實際的攝像機硬件和HAL的實現進行交互。攝像機和驅動程序必須支持YV12和NV21圖像格式,以支持預覽顯示屏和視頻記錄上的攝像機圖像。

實施HAL(舊版)

HAL位於攝像頭驅動程序和更高級別的Android框架之間,並定義了必須實現的接口,以便應用程序可以正確操作攝像頭硬件。 HAL接口在hardware/libhardware/include/hardware/camera.hhardware/libhardware/include/hardware/camera_common.h頭文件中定義。

camera_common.h定義camera_module ,這是一種標準結構,用於獲取有關攝像機的常規信息,例如所有攝像機(即,前置攝像頭或後置攝像頭)共有的攝像頭ID和屬性。

camera.h包含與android.hardware.Camera對應的代碼。該頭文件聲明了camera_device結構,該結構又包含帶有用於實現HAL接口的函數的指針的camera_device_ops結構。有關開發人員可以設置的攝像機參數的文檔,請參閱frameworks/av/include/camera/CameraParameters.h 。這些參數通過HAL中的int (*set_parameters)(struct camera_device *, const char *parms)指向的函數設置。

有關HAL實現的示例,請參閱hardware/ti/omap4xxx/camera的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可以正確加載該庫。有關示例,請參閱hardware/ti/omap4xxx/Android.mk的Galaxy Nexus相機的makefile。

  3. 通過將frameworks/native/data/etc目錄中的必要功能XML文件複製到設備的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生成文件中添加以下行,以將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. 要將Camera應用程序包含在設備的系統映像中,請在設備的device/<company>/<device>/device.mk生成文件中的PRODUCT_PACKAGES變量中將其指定:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...