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

Рисунок 1. Архитектура камеры
- фреймворк приложения
- На уровне фреймворка приложения находится код приложения, который использует API Camera 2 для взаимодействия с аппаратным обеспечением камеры. Внутри этот код вызывает соответствующие интерфейсы Binder для доступа к нативному коду, взаимодействующему с камерой.
- AIDL
-  Интерфейс связывателя, связанный с 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 и определяет интерфейс, который необходимо реализовать для корректной работы приложений с оборудованием камеры. Интерфейсы HIDL для 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 для камер на 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 . Эти параметры задаются функцией, на которую в HAL указывает int (*set_parameters)(struct camera_device *, const char *parms) .
 Пример реализации HAL см. в реализации HAL для Galaxy Nexus в 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-файлом вашего устройства. Например, чтобы указать, что на вашем устройстве есть вспышка и функция автофокусировки, добавьте следующие строки в make-файл<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 \ ... 
