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

圖1.相機架構
- 應用框架
- 在應用程序框架級別是應用程序的代碼,它使用Camera 2 API與攝像頭硬件進行交互。在內部,此代碼調用相應的Binder接口以訪問與相機交互的本機代碼。
- 圖書館
- 與
CameraService
關聯的活頁夾接口可以在frameworks / 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
和ICameraDeviceCallbacks
分別是應用程序框架的CameraService
和CameraDevice
回調。 - 攝影服務
- 攝影機服務位於
frameworks/av/services/camera/libcameraservice/CameraService.cpp
,是與HAL交互的實際代碼。 - 哈爾
- 硬件抽象層定義了相機服務調用的標準接口,並且必須實現該標準接口才能使相機硬件正常工作。
實施HAL
HAL位於攝像頭驅動程序和更高級別的Android框架之間,並定義了必須實現的接口,以便應用程序可以正確操作攝像頭硬件。相機HAL的HIDL接口在hardware / interfaces / camera中定義。
典型的綁定HAL必須實現以下HIDL接口:
-
ICameraProvider
:用於枚舉單個設備並管理其狀態。 -
ICameraDevice
:相機設備界面。 -
ICameraDeviceSession
:活動的相機設備會話界面。
參考HIDL實現可用於CameraProvider.cpp
, CameraDevice.cpp
和CameraDeviceSession.cpp
。該實現包裝仍使用舊API的舊HAL。從Android 8.0開始,Camera HAL實現必須使用HIDL API。不支持使用舊版界面。
舊版HAL組件
本節描述了舊版HAL組件的體系結構以及如何實現HAL。如上所述,Android 8.0及更高版本上的Camera HAL實現必須改用HIDL API。
建築(舊版)
下圖和列表描述了舊相機HAL組件。

圖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.h
和hardware/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
文件將其複製到適當的位置:
- 創建一個
device/<company_name>/<device_name>/camera
目錄以包含庫的源文件。 - 創建一個
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。 - 通過將
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
。 - 在
device/<company_name>/<device_name>/media_profiles.xml
和device/<company_name>/<device_name>/media_codecs.xml
XML文件中聲明相機的媒體編解碼器,格式和分辨率功能。有關詳細信息,請參閱將編解碼器暴露給框架。 - 在設備的
device/<company_name>/<device_name>/device.mk
生成文件中添加以下行,以將media_profiles.xml
和media_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
- 要將Camera應用程序包含在設備的系統映像中,請在設備的
device/<company>/<device>/device.mk
makefile中的PRODUCT_PACKAGES
變量中指定它:PRODUCT_PACKAGES := \ Gallery2 \ ...