
Слой аппаратной абстракции камеры 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 .
- связующее 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 на 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 для получения доступа к службе камеры.
- связыватель 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 см. в реализации для 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-файлом вашего устройства. Например, чтобы указать, что ваше устройство оснащено вспышкой камеры и поддерживает автофокусировку, добавьте следующие строки в 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 \ Пример make-файла устройства см. в 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 \ ... 
