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

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