Cámara

Ícono de la HAL de la cámara de Android

La capa de abstracción de hardware de la cámara (HAL) de Android conecta el hardware de las APIs del framework de la cámara en Camera 2 al hardware y el controlador de la cámara subyacente El subsistema de la cámara incluye implementaciones para componentes de canalización de la cámara, mientras que la HAL de la cámara y proporciona interfaces para usar en la implementación de tu versión de estos o los componentes de la solución.

Arquitectura

En la siguiente figura y lista, se describen los componentes de la HAL.

Arquitectura de la cámara de Android

Figura 1: Arquitectura de la cámara

framework de apps
A nivel del framework de la app, se encuentra el código de la app, que usa API de Camera 2 para interactuar con el hardware de la cámara Internamente, este código llamadas correspondientes Binder para acceder al código nativo que interactúa con el cámara.
AIDL
La interfaz de Binder asociada con CameraService puede encontradas en frameworks/av/camera/aidl/android/hardware. El código generado llama al código nativo de nivel inferior para obtener acceso a la cámara física y devuelve los datos que se usan para crear la CameraDevice y, finalmente, CameraCaptureSession a nivel del framework.
framework nativo
Este framework, alojado en frameworks/av/, proporciona un equivalente nativo al CameraDevice y CameraCaptureSession . Consulta también Referencia de camera2 del NDK.
interfaz IPC de Binder
La interfaz de Binder de IPC facilita la comunicación a través de los límites del proceso. Hay varias clases Binder de cámara ubicadas en el frameworks/av/camera/camera/aidl/android/hardware que llamada al servicio de cámara. ICameraService es la interfaz para el servicio de cámara. ICameraDeviceUser es la interfaz de un entorno abierto dispositivo de cámara; y ICameraServiceListener y ICameraDeviceCallbacks son las respectivas CameraService y CameraDevice de devoluciones a la framework de aplicaciones.
servicio de cámara
El servicio de cámara, ubicado en frameworks/av/services/camera/libcameraservice/CameraService.cpp, es el código real que interactúa con la HAL.
HAL
La capa de abstracción de hardware define la interfaz estándar a la que el servicio de cámara y que debes implementar para que tu cámara que el hardware funcione correctamente.

Implementa la HAL

La HAL se encuentra entre el controlador de la cámara y el framework de Android de nivel superior. y define una interfaz que debes implementar para que las apps funcionen correctamente el hardware de la cámara. El HIDL interfaces para la HAL de la cámara se definen en hardware/interfaces/cámara.

Una HAL con Binder típica debe implementar las siguientes interfaces de HIDL:

Las implementaciones de HIDL de referencia están disponibles para CameraProvider.cpp: CameraDevice.cpp y CameraDeviceSession.cpp La implementación une las HAL antiguas que todavía usan API heredada. A partir de Android 8.0, las implementaciones de la HAL de la cámara deben usar la API de HIDL. usar de la interfaz heredada.

Validación de entradas

Como la HAL tiene acceso a recursos diferentes a los del servicio de cámara, el límite entre ambos se tratan como un límite de seguridad. Esto significa que los parámetros que se pasan no se considera confiable ni está depurado. Para evitar vulnerabilidades de seguridad que les permitan a los atacantes elevar privilegios o acceder a datos a los que no está previsto, la HAL de la cámara debe valida los parámetros que se pasan del servicio de cámara a la HAL. Esto incluye verificar ese búfer los valores de longitud estén dentro de los rangos permitidos y se desinfecten los parámetros antes de usarlos y antes y las pasa a controladores de hardware o kernel.

Componentes de HAL heredados

En esta sección, se describe la arquitectura de los componentes de la HAL heredada y cómo implementar la HAL. Las implementaciones de la HAL de la cámara en Android 8.0 y versiones posteriores deben usar la API de HIDL como se describió anteriormente.

Arquitectura (heredada)

En la siguiente figura y la lista, se describen los componentes de la HAL de la cámara heredada.

Arquitectura de la cámara de Android

Figura 2: Arquitectura de cámara heredada

framework de apps
A nivel del framework de la app, se encuentra el código de la app, que usa android.hardware.Camera para interactuar con el hardware de la cámara. Internamente, este código llama a clase glue de JNI correspondiente para acceder al código nativo que interactúa con el cámara.
JNI
El código JNI asociado con android.hardware.Camera se encuentra en frameworks/base/core/jni/android_hardware_Camera.cpp Este código llama al código nativo de nivel inferior para obtener acceso a la cámara física y devuelve los datos que se usan para crear la Un objeto android.hardware.Camera a nivel del framework.
framework nativo
El marco de trabajo nativo definido en frameworks/av/camera/Camera.cpp proporciona un equivalente nativo al android.hardware.Camera. Esta clase llama a la IPC proxies Binder para obtener acceso al servicio de cámara.
proxies IPC de Binder
Los proxies de Binder de IPC facilitan la comunicación a través de los límites de procesos. Hay tres clases de Binder de cámara que se encuentran en el frameworks/av/camera que llama al servicio de cámara ICameraService es la interfaz para el servicio de cámara. ICamera es la interfaz de un dispositivo de cámara específico abierto. y ICameraClient es la interfaz del dispositivo de regreso a la framework de aplicaciones.
servicio de cámara
El servicio de cámara, ubicado en frameworks/av/services/camera/libcameraservice/CameraService.cpp, es el código real que interactúa con la HAL.
HAL
La capa de abstracción de hardware define la interfaz estándar a la que el servicio de cámara y que debes implementar para que tu cámara que el hardware funcione correctamente.
controlador de kernel
El controlador de la cámara interactúa con el hardware real de la cámara y tu implementación de la HAL. La cámara y el controlador deben ser compatibles con YV12 y NV21 formatos de imagen para permitir la vista previa de la imagen de la cámara en la pantalla y grabación de video.

Implementa la HAL (heredada)

La HAL se encuentra entre el controlador de la cámara y el framework de Android de nivel superior. y define una interfaz que debes implementar para que las apps funcionen correctamente el hardware de la cámara. La interfaz de la HAL se define en el hardware/libhardware/include/hardware/camera.h y hardware/libhardware/include/hardware/camera_common.h archivos de encabezado.

camera_common.h define camera_module, un lenguaje estructura para obtener información general sobre la cámara, como su ID y propiedades comunes a todas las cámaras (es decir, ya sea una cámara frontal o una cámara posterior).

camera.h contiene código que corresponde a android.hardware.Camera Este archivo de encabezado declara un El struct camera_device que, a su vez, contiene un Estructura camera_device_ops con punteros a funciones que implementan la interfaz de la HAL. Para ver la documentación sobre los parámetros de la cámara, los desarrolladores pueden consulta frameworks/av/include/camera/CameraParameters.h. Estos parámetros se establecen con la función a la que apunta int (*set_parameters)(struct camera_device *, const char *parms) en la HAL.

Para ver un ejemplo de implementación de HAL, consulta la implementación del Galaxy Nexus HAL en hardware/ti/omap4xxx/camera

Cómo configurar la biblioteca compartida

Cómo configurar el sistema de compilación de Android para empaquetar correctamente la implementación de HAL en una biblioteca compartida y copiarlo en la ubicación correcta creando un Archivo Android.mk:

  1. Crea un device/<company_name>/<device_name>/camera para que contenga los archivos de origen de la biblioteca.
  2. Crea un archivo Android.mk para compilar la biblioteca compartida. Asegúrate de que Makefile contiene las siguientes líneas:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    El nombre de tu biblioteca debe ser camera.<device_name>. (.so se agrega automáticamente), por lo que Android puede cargar correctamente el archivo biblioteca. Para ver un ejemplo, consulta el archivo makefile de la cámara de Galaxy Nexus en la hardware/ti/omap4xxx/Android.mk

  3. Especifica que tu dispositivo tenga funciones de cámara copiando el XML de funciones necesario. en el directorio frameworks/native/data/etc con el Make del dispositivo. Por ejemplo, para especificar que tu dispositivo tiene el flash de la cámara y puedes enfocar automáticamente, agrega las siguientes líneas en la pantalla <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 \
    

    Puedes ver un ejemplo de un archivo makefile de un dispositivo en la página device/samsung/tuna/device.mk

  4. Declara el códec multimedia, el formato y las capacidades de resolución de tu cámara en device/<company_name>/<device_name>/media_profiles.xml y device/<company_name>/<device_name>/media_codecs.xml. en formato XML. Para obtener más información, consulta Exponer códecs al de la aplicación.
  5. Agrega las siguientes líneas al directorio Archivo makefile de device/<company_name>/<device_name>/device.mk para copiar media_profiles.xml y media_codecs.xml a la ubicación adecuada:
    # 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
    
  6. Para incluir la app de Cámara en la imagen de sistema del dispositivo, especifícala en el La variable PRODUCT_PACKAGES en la configuración device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...