![Icono HAL de cámara Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=2&hl=es)
La capa de abstracción de hardware de la cámara (HAL) de Android conecta las API del marco de la cámara de nivel superior en la Cámara 2 al controlador y al hardware de la cámara subyacente. El subsistema de cámara incluye implementaciones para componentes de canalización de cámara, mientras que la cámara HAL proporciona interfaces para usar en la implementación de su versión de estos componentes.
Arquitectura
La siguiente figura y lista describen los componentes de HAL.
![Arquitectura de la cámara de Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=2&hl=es)
Figura 1. Arquitectura de la cámara
- marco de aplicación
- En el nivel del marco de la aplicación está el código de la aplicación, que utiliza la API de Camera 2 para interactuar con el hardware de la cámara. Internamente, este código llama a las interfaces de Binder correspondientes para acceder al código nativo que interactúa con la cámara.
- AIDL
- La interfaz de carpeta asociada con
CameraService
se puede encontrar 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 datos que se utilizan para crear los objetosCameraDevice
y, finalmente,CameraCaptureSession
en el nivel del marco. - marco nativo
- Este marco que reside en
frameworks/av/
proporciona un equivalente nativo a las clasesCameraDevice
yCameraCaptureSession
. Consulte también la referencia de la cámara NDK2 . - interfaz IPC de carpeta
- La interfaz de carpeta IPC facilita la comunicación a través de los límites del proceso. Hay varias clases de carpetas de cámaras ubicadas en el directorio
frameworks/av/camera/camera/aidl/android/hardware
que llaman al servicio de cámara.ICameraService
es la interfaz del servicio de cámara;ICameraDeviceUser
es la interfaz para un dispositivo de cámara abierto específico; yICameraServiceListener
eICameraDeviceCallbacks
son las respectivas devoluciones de llamadaCameraService
yCameraDevice
al marco de la aplicación. - 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 HAL. - HAL
- La capa de abstracción de hardware define la interfaz estándar a la que llama el servicio de cámara y que usted debe implementar para que el hardware de su cámara funcione correctamente.
Implementando el HAL
HAL se encuentra entre el controlador de la cámara y el marco de trabajo de Android de nivel superior y define una interfaz que debe implementar para que las aplicaciones puedan operar correctamente el hardware de la cámara. Las interfaces HIDL para la cámara HAL se definen en hardware/interfaces/camera .
Un HAL enlazado típico debe implementar las siguientes interfaces HIDL:
-
ICameraProvider
: para enumerar dispositivos individuales y administrar su estado. -
ICameraDevice
: la interfaz del dispositivo de la cámara. -
ICameraDeviceSession
: la interfaz de sesión del dispositivo de cámara activa.
Hay implementaciones HIDL de referencia disponibles para CameraProvider.cpp
, CameraDevice.cpp
y CameraDeviceSession.cpp
. La implementación incluye HAL antiguos que todavía utilizan la API heredada . A partir de Android 8.0, las implementaciones de Camera HAL deben usar la API HIDL; No se admite el uso de la interfaz heredada.
Validación de entrada
Debido a que HAL tiene acceso a recursos diferentes a los del servicio de cámara, el límite entre los dos se trata como un límite de seguridad. Esto significa que los parámetros pasados desde el servicio de cámara se consideran no confiables y no desinfectados. Para evitar vulnerabilidades de seguridad que permitan a los atacantes escalar privilegios o acceder a datos a los que no deberían tener acceso, la cámara HAL debe validar los parámetros pasados desde el servicio de cámara a la HAL. Esto incluye verificar que los valores de longitud del búfer estén dentro de los rangos permitidos y desinfectar los parámetros antes de usarlos y antes de pasarlos a los controladores de hardware o kernel.
Componentes HAL heredados
Esta sección describe la arquitectura de los componentes HAL heredados y cómo implementar HAL. Las implementaciones de Camera HAL en Android 8.0 y versiones posteriores deben usar la API HIDL, descrita anteriormente.
Arquitectura (legado)
La siguiente figura y lista describen los componentes HAL de la cámara heredada.
![Arquitectura de la cámara de Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera.png?authuser=2&hl=es)
Figura 2. Arquitectura de cámara heredada
- marco de aplicación
- En el nivel del marco de la aplicación está el código de la aplicación, que utiliza la API
android.hardware.Camera
para interactuar con el hardware de la cámara. Internamente, este código llama a una clase de pegamento JNI correspondiente para acceder al código nativo que interactúa con la cámara. - JNI
- El código JNI asociado con
android.hardware.Camera
se encuentra enframeworks/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 datos que se utilizan para crear el objetoandroid.hardware.Camera
en el nivel del marco. - marco nativo
- El marco nativo definido en
frameworks/av/camera/Camera.cpp
proporciona un equivalente nativo a la claseandroid.hardware.Camera
. Esta clase llama a los servidores proxy del enlazador IPC para obtener acceso al servicio de cámara. - servidores proxy IPC de carpeta
- Los servidores proxy de carpeta IPC facilitan la comunicación a través de los límites del proceso. Hay tres clases de carpetas de cámara que se encuentran en el directorio
frameworks/av/camera
que llama al servicio de cámara.ICameraService
es la interfaz del servicio de cámara,ICamera
es la interfaz de un dispositivo de cámara abierto específico eICameraClient
es la interfaz del dispositivo con el marco de la aplicación. - 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 HAL. - HAL
- La capa de abstracción de hardware define la interfaz estándar a la que llama el servicio de cámara y que usted debe implementar para que el hardware de su cámara funcione correctamente.
- controlador del núcleo
- El controlador de la cámara interactúa con el hardware de la cámara real y su implementación de HAL. La cámara y el controlador deben admitir los formatos de imagen YV12 y NV21 para brindar soporte para la vista previa de la imagen de la cámara en la pantalla y la grabación de video.
Implementación de HAL (heredado)
HAL se encuentra entre el controlador de la cámara y el marco de trabajo de Android de nivel superior y define una interfaz que debe implementar para que las aplicaciones puedan operar correctamente el hardware de la cámara. La interfaz HAL se define en los archivos de encabezado hardware/libhardware/include/hardware/camera.h
y hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
define camera_module
, una estructura estándar para obtener información general sobre la cámara, como el ID de la cámara y las propiedades comunes a todas las cámaras (es decir, si es una cámara frontal o trasera).
camera.h
contiene código que corresponde a android.hardware.Camera
. Este archivo de encabezado declara una estructura camera_device
que a su vez contiene una estructura camera_device_ops
con punteros a funciones que implementan la interfaz HAL. Para obtener documentación sobre los parámetros de la cámara que los desarrolladores pueden configurar, consulte frameworks/av/include/camera/CameraParameters.h
. Estos parámetros se configuran con la función apuntada por int (*set_parameters)(struct camera_device *, const char *parms)
en HAL.
Para ver un ejemplo de una implementación HAL, consulte la implementación para Galaxy Nexus HAL en hardware/ti/omap4xxx/camera
.
Configurar la biblioteca compartida
Configure el sistema de compilación de Android para empaquetar correctamente la implementación HAL en una biblioteca compartida y cópiela en la ubicación adecuada creando un archivo Android.mk
:
- Cree un directorio
device/<company_name>/<device_name>/camera
para contener los archivos fuente de su biblioteca. - Cree un archivo
Android.mk
para crear la biblioteca compartida. Asegúrese de que el archivo MAKE contenga las siguientes líneas:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Su biblioteca debe llamarse
camera.<device_name>
(.so
se agrega automáticamente), para que Android pueda cargar la biblioteca correctamente. Para ver un ejemplo, consulte el archivo MAKE de la cámara Galaxy Nexus ubicado enhardware/ti/omap4xxx/Android.mk
. - Especifique que su dispositivo tiene funciones de cámara copiando los archivos XML de funciones necesarias en el directorio
frameworks/native/data/etc
con el archivo MAKE de su dispositivo. Por ejemplo, para especificar que su dispositivo tiene un flash de cámara y puede enfocar automáticamente, agregue las siguientes líneas en el archivo make<device>/<company_name>/<device_name>/device.mk
de su dispositivo: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 \
Para ver un ejemplo de un archivo MAKE de dispositivo, consulte
device/samsung/tuna/device.mk
. - Declare el códec multimedia, el formato y las capacidades de resolución de su cámara en los archivos XML
device/<company_name>/<device_name>/media_profiles.xml
ydevice/<company_name>/<device_name>/media_codecs.xml
. Para obtener más información, consulte Exponer códecs al marco . - Agregue las siguientes líneas en el archivo MAKE
device/<company_name>/<device_name>/device.mk
de su dispositivo para copiar los archivosmedia_profiles.xml
ymedia_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
- Para incluir la aplicación Cámara en la imagen del sistema de su dispositivo, especifíquela en la variable
PRODUCT_PACKAGES
en el archivo makefiledevice/<company>/<device>/device.mk
de su dispositivo:PRODUCT_PACKAGES := \ Gallery2 \ ...