
Уровень аппаратной абстракции камеры (HAL) Android соединяет API-интерфейсы высокоуровневой платформы камеры в Camera 2 с вашим базовым драйвером камеры и оборудованием. Подсистема камеры включает реализации для компонентов конвейера камеры, в то время как HAL камеры предоставляет интерфейсы для использования в реализации вашей версии этих компонентов.
Архитектура
На следующем рисунке и в списке описаны компоненты HAL.

Рисунок 1. Архитектура камеры
- рамки приложения
- На уровне инфраструктуры приложения находится код приложения, который использует API камеры 2 для взаимодействия с оборудованием камеры. Внутри этот код вызывает соответствующие интерфейсы Binder для доступа к собственному коду, который взаимодействует с камерой.
- AIDL
- Интерфейс связующего, связанный с
CameraService
можно найти в frameworks / av / camera / aidl / android / hardware . Сгенерированный код вызывает машинный код более низкого уровня , чтобы получить доступ к физическим данным камеры и возвращает , которые используются для созданияCameraDevice
и в конечном счетеCameraCaptureSession
объектов на уровне каркаса. - родная структура
- Эта структура проживающий в
frameworks/av/
обеспечивает нативные , эквивалентнуюCameraDevice
иCameraCaptureSession
классов. См. Также ссылку на NDK camera2 . - binder IPC интерфейс
- Интерфейс связывания IPC упрощает обмен данными через границы процесса. В
frameworks/av/camera/camera/aidl/android/hardware
есть несколько классовframeworks/av/camera/camera/aidl/android/hardware
которые вызывают службу камеры.ICameraService
- интерфейс службы камеры;ICameraDeviceUser
- это интерфейс к определенному открытому устройству камеры; иICameraServiceListener
иICameraDeviceCallbacks
являются соответствующиеCameraService
иCameraDevice
обратных вызовов в рамках приложения. - сервис камеры
- Сервис камеры, расположенный в
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, представляет собой фактический код, который взаимодействует с HAL. - HAL
- Уровень аппаратной абстракции определяет стандартный интерфейс, который вызывается службой камеры и который необходимо реализовать для правильной работы оборудования камеры.
Внедрение HAL
HAL находится между драйвером камеры и платформой Android более высокого уровня и определяет интерфейс, который необходимо реализовать, чтобы приложения могли правильно управлять оборудованием камеры. Интерфейсы HIDL для камеры HAL определены в аппаратном обеспечении / интерфейсах / камере .
Типичный binderized HAL должен реализовывать следующие интерфейсы HIDL:
-
ICameraProvider
: для перечисления отдельных устройств и управления их статусом. -
ICameraDevice
: интерфейс устройства камеры. -
ICameraDeviceSession
: интерфейс сеанса активного устройства камеры.
Реализации Reference HIDL доступны для CameraProvider.cpp
, CameraDevice.cpp
, и CameraDeviceSession.cpp
. Реализация охватывает старые HAL, которые все еще используют устаревший API . Начиная с Android 8.0, реализации Camera HAL должны использовать HIDL API; использование устаревшего интерфейса не поддерживается.
Устаревшие компоненты HAL
В этом разделе описывается архитектура унаследованных компонентов HAL и способы реализации HAL. Реализации камеры HAL на Android 8.0 и выше должны использовать вместо этого HIDL API, описанный выше.
Архитектура (наследие)
На следующем рисунке и в списке описаны устаревшие компоненты HAL камеры.

Рис. 2. Устаревшая архитектура камеры
- рамки приложения
- На уровне платформы приложения находится код приложения, который использует API
android.hardware.Camera
для взаимодействия с оборудованием камеры. Внутри этот код вызывает соответствующий связующий класс JNI для доступа к собственному коду, который взаимодействует с камерой. - 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 для получения доступа к службе камеры. - binder IPC прокси
- Прокси-серверы связывания IPC облегчают обмен данными через границы процесса. В каталоге
frameworks/av/camera
есть три класса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
, стандартную структуру для получения общей информации о камере, такой как идентификатор камеры и свойства, общие для всех камер (то есть, является ли это фронтальной или задней камерой).
camera.h
содержит код, соответствующий android.hardware.Camera
. Этот заголовочный файл объявляет структуру camera_device
которая, в свою очередь, содержит структуру camera_device_ops
с указателями на функции, реализующие интерфейс HAL. Документацию по параметрам камеры, которые могут устанавливать разработчики, см. В frameworks/av/include/camera/CameraParameters.h
. Эти параметры устанавливаются функцией, на которую указывает int (*set_parameters)(struct camera_device *, const char *parms)
в HAL.
Для примера реализации HAL обратитесь к реализации для Galaxy Nexus HAL в hardware/ti/omap4xxx/camera
.
Настройка общей библиотеки
Настройте систему сборки Android, чтобы правильно упаковать реализацию HAL в общую библиотеку и скопировать ее в соответствующее место, создав файл Android.mk
:
- Создайте
device/<company_name>/<device_name>/camera
исходные файлы вашей библиотеки. - Создайте файл
Android.mk
для создания общей библиотеки. Убедитесь, что make-файл содержит следующие строки:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Ваша библиотека должна называться
camera.<device_name>
(.so
добавляется автоматически), чтобы Android мог правильно загрузить библиотеку. В качестве примера см. Make-файл для камеры Galaxy Nexus, расположенный вhardware/ti/omap4xxx/Android.mk
. - Укажите, что на вашем устройстве есть функции камеры, скопировав необходимые XML-файлы функций в каталог
frameworks/native/data/etc
с make-файлом вашего устройства. Например, чтобы указать, что ваше устройство имеет вспышку камеры и может выполнять автофокусировку, добавьте следующие строки в файл<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 \
Пример файла
device/samsung/tuna/device.mk
устройства см. В разделеdevice/samsung/tuna/device.mk
. -
device/<company_name>/<device_name>/media_profiles.xml
возможностиdevice/<company_name>/<device_name>/media_profiles.xml
, формата и разрешения вашей камеры в XML-файлахdevice/<company_name>/<device_name>/media_profiles.xml
иdevice/<company_name>/<device_name>/media_codecs.xml
. В разделе Предоставление кодеков фреймворку . - Добавьте следующие строки в файл makefile
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
- Чтобы включить приложение камеры в образ системы вашего устройства, укажите его в переменной
PRODUCT_PACKAGES
вdevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...