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

Рисунок 1. Архитектура камеры
- фреймворк приложения
- На уровне фреймворка приложения находится код приложения, который использует API Camera 2 для взаимодействия с аппаратным обеспечением камеры. Внутри этот код вызывает соответствующие интерфейсы Binder для доступа к собственному коду, который взаимодействует с камерой.
- АЙДЛ
- Интерфейс связывателя, связанный с
CameraService
, можно найти в frameworks/av/camera/aidl/android/hardware . Сгенерированный код вызывает собственный код нижнего уровня для получения доступа к физической камере и возвращает данные, которые используются для создания объектовCameraDevice
и, в конечном итоге,CameraCaptureSession
на уровне фреймворка. - собственный фреймворк
- Этот фреймворк, находящийся в
frameworks/av/
предоставляет собственный эквивалент классовCameraDevice
иCameraCaptureSession
. См. также NDK camera2 reference . - Интерфейс 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 более высокого уровня и определяет интерфейс, который необходимо реализовать, чтобы приложения могли правильно управлять оборудованием камеры. Интерфейсы HIDL для HAL камеры определены в hardware/interfaces/camera .
Типичный связанный HAL должен реализовывать следующие интерфейсы HIDL:
-
ICameraProvider
: Для перечисления отдельных устройств и управления их статусом. -
ICameraDevice
: Интерфейс устройства камеры. -
ICameraDeviceSession
: активный интерфейс сеанса устройства камеры.
Справочные реализации HIDL доступны для CameraProvider.cpp
, CameraDevice.cpp
и CameraDeviceSession.cpp
. Реализация оборачивает старые HAL, которые все еще используют устаревший API . Начиная с Android 8.0, реализации Camera HAL должны использовать HIDL API; использование устаревшего интерфейса не поддерживается.
Проверка входных данных
Поскольку HAL имеет доступ к другим ресурсам, чем служба камеры, граница между ними рассматривается как граница безопасности. Это означает, что параметры, переданные службой камеры, считаются ненадежными и недезинфицированными. Чтобы предотвратить уязвимости безопасности, которые позволяют злоумышленникам повышать привилегии или получать доступ к данным, к которым у них не должно быть доступа, HAL камеры должен проверять параметры, переданные службой камеры в HAL. Это включает проверку того, что значения длины буфера находятся в допустимых диапазонах, и очистку параметров перед использованием и перед передачей их в аппаратные или драйверы ядра.
Устаревшие компоненты HAL
В этом разделе описывается архитектура устаревших компонентов HAL и как реализовать HAL. Реализации HAL камеры на Android 8.0 и выше должны использовать API HIDL, описанный выше.
Архитектура (наследие)
На следующем рисунке и в списке описаны компоненты HAL устаревшей камеры.

Рисунок 2. Устаревшая архитектура камеры
- фреймворк приложения
- На уровне фреймворка приложения находится код приложения, который использует API
android.hardware.Camera
для взаимодействия с аппаратным обеспечением камеры. Внутри этот код вызывает соответствующий класс JNI Glue для доступа к собственному коду, который взаимодействует с камерой. - 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-связующего устройства
- Прокси-серверы 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
— стандартную структуру для получения общей информации о камере, такой как идентификатор камеры и свойства, общие для всех камер (то есть, является ли она фронтальной или тыловой камерой).
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 см. в реализации HAL для Galaxy Nexus в 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 мог правильно загрузить библиотеку. Для примера см. makefile для камеры Galaxy Nexus, расположенный вhardware/ti/omap4xxx/Android.mk
. - Укажите, что ваше устройство имеет функции камеры, скопировав необходимые XML-файлы функций в каталог
frameworks/native/data/etc
с makefile вашего устройства. Например, чтобы указать, что ваше устройство имеет вспышку камеры и может выполнять автофокусировку, добавьте следующие строки в makefile<device>/<company_name>/<device_name>/device.mk
вашего устройства: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
. - Объявите возможности медиакодека, формата и разрешения вашей камеры в файлах XML
device/<company_name>/<device_name>/media_profiles.xml
иdevice/<company_name>/<device_name>/media_codecs.xml
. Подробности см. в разделе Предоставление кодеков фреймворку . - Добавьте следующие строки в make-файл
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
в make-файлеdevice/<company>/<device>/device.mk
вашего устройства:PRODUCT_PACKAGES := \ Gallery2 \ ...