
La capa de abstracción de hardware (HAL) de la cámara de Android conecta las APIs del framework de la cámara de nivel superior en Camera 2 con el controlador y el hardware de la cámara subyacentes. El subsistema de cámara incluye implementaciones para los componentes de la canalización de la cámara, mientras que el HAL de la cámara proporciona interfaces para usar en la implementación de tu versión de estos componentes.
Arquitectura
En la siguiente figura y lista, se describen los componentes del HAL.

Figura 1: Arquitectura de la cámara
- Marco de trabajo de la app
- A nivel del framework de la app, se encuentra el código de la app, que usa 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 Binder 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 usan para crear los objetosCameraDevice
y, finalmente,CameraCaptureSession
a nivel del framework. - framework nativo
- Este framework que reside en
frameworks/av/
proporciona un equivalente nativo para las clasesCameraDevice
yCameraCaptureSession
. Consulta también la referencia de camera2 del NDK. - Interfaz de IPC de Binder
- La interfaz del binder de IPC facilita la comunicación a través de los límites del proceso.
Hay varias clases de vinculación de la cámara ubicadas en el directorio
frameworks/av/camera/camera/aidl/android/hardware
que llaman al servicio de la cámara.ICameraService
es la interfaz del servicio de cámara;ICameraDeviceUser
es la interfaz de un dispositivo de cámara específico abierto; yICameraServiceListener
yICameraDeviceCallbacks
son las devoluciones de llamadaCameraService
yCameraDevice
respectivas al marco de trabajo de la app. - 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 llama el servicio de cámara y que debes implementar para que el hardware de la cámara funcione correctamente.
Implementa el 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 puedan operar correctamente el hardware de la cámara. Las interfaces de HIDL para la HAL de la cámara se definen en hardware/interfaces/camera.
Una HAL binderizada típica debe implementar las siguientes interfaces de HIDL:
-
ICameraProvider
: Para enumerar dispositivos individuales y administrar su estado. -
ICameraDevice
: Es la interfaz del dispositivo de cámara. -
ICameraDeviceSession
: Es la interfaz de sesión activa del dispositivo de cámara.
Las implementaciones de referencia de HIDL están disponibles para CameraProvider.cpp
,
CameraDevice.cpp
y CameraDeviceSession.cpp
.
La implementación une los HAL antiguos que aún usan la API heredada.
A partir de Android 8.0, las implementaciones de la HAL de cámara deben usar la API de HIDL. No se admite el uso de la interfaz heredada.
Validación de entradas
Dado que el HAL tiene acceso a diferentes recursos que el servicio de cámara, el límite entre ambos se considera un límite de seguridad. Esto significa que los parámetros que se pasan desde el servicio de la cámara se consideran no confiables y no sanitizados. Para evitar vulnerabilidades de seguridad que permitan a los atacantes aumentar los privilegios o acceder a datos a los que no deberían tener acceso, la HAL de la cámara debe validar los parámetros que se pasan del servicio de la cámara a la HAL. Esto incluye verificar que los valores de longitud del búfer estén dentro de los rangos permitidos y limpiar los parámetros antes de usarlos y antes de pasarlos a los controladores de hardware o del kernel.
Componentes de HAL heredados
En esta sección, se describe la arquitectura de los componentes HAL heredados y cómo implementar el HAL. Las implementaciones de 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 lista, se describen los componentes heredados del HAL de la cámara.

Figura 2: Arquitectura de cámara heredada
- Marco de trabajo de la app
- En el nivel del framework de la app, se encuentra el código de la app, que usa la API de
android.hardware.Camera
para interactuar con el hardware de la cámara. De forma interna, este código llama a una clase de vinculación de 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 usan para crear el objetoandroid.hardware.Camera
a nivel del framework. - framework nativo
- El framework nativo definido en
frameworks/av/camera/Camera.cpp
proporciona un equivalente nativo para la claseandroid.hardware.Camera
. Esta clase llama a los proxies del binder de IPC para obtener acceso al servicio de cámara. - Proxies de IPC del binder
- Los proxies de binder de IPC facilitan la comunicación a través de los límites del proceso.
Hay tres clases de vinculación de la cámara que se encuentran en el directorio
frameworks/av/camera
que llama al servicio de la cámara.ICameraService
es la interfaz del servicio de cámara,ICamera
es la interfaz de un dispositivo de cámara abierto específico yICameraClient
es la interfaz del dispositivo de vuelta al framework de la app. - 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 llama el servicio de cámara y que debes implementar para que el hardware de la cámara funcione correctamente.
- Controlador del kernel
- El controlador de la cámara interactúa con el hardware de la cámara real y con tu implementación de la HAL. La cámara y el controlador deben admitir los formatos de imagen YV12 y NV21 para permitir la vista previa de la imagen de la cámara en la pantalla y la grabación de video.
Implementa el HAL (heredado)
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 puedan operar correctamente el hardware de la cámara. La interfaz de 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 del HAL. Para obtener documentación sobre los parámetros de la cámara que pueden establecer los desarrolladores, consulta frameworks/av/include/camera/CameraParameters.h
.
Estos parámetros se configuran con la función a la que apunta int
(*set_parameters)(struct camera_device *, const char *parms)
en el HAL.
Para ver un ejemplo de implementación del HAL, consulta la implementación del HAL de Galaxy Nexus en hardware/ti/omap4xxx/camera
.
Configura la biblioteca compartida
Configura el sistema de compilación de Android para empaquetar correctamente la implementación del HAL en una biblioteca compartida y copiarla en la ubicación adecuada creando un archivo Android.mk
:
- Crea un directorio
device/<company_name>/<device_name>/camera
para que contenga los archivos fuente de tu biblioteca. - Crea un archivo
Android.mk
para compilar la biblioteca compartida. Asegúrate de que el archivo makefile contenga las siguientes líneas:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Tu biblioteca debe llamarse
camera.<device_name>
(.so
se agrega automáticamente) para que Android pueda cargarla correctamente. Para ver un ejemplo, consulta el archivo makefile de la cámara del Galaxy Nexus ubicado enhardware/ti/omap4xxx/Android.mk
. - Para especificar que tu dispositivo tiene funciones de cámara, copia los archivos XML de funciones necesarios en el directorio
frameworks/native/data/etc
con el archivo makefile de tu dispositivo. Por ejemplo, para especificar que tu dispositivo tiene flash de cámara y puede enfocar automáticamente, agrega las siguientes líneas al archivo<device>/<company_name>/<device_name>/device.mk
de tu 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, consulta
device/samsung/tuna/device.mk
. - Declara las capacidades de códec, formato y resolución de medios de tu 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, consulta Cómo exponer códecs al framework. - Agrega las siguientes líneas al archivo makefile
device/<company_name>/<device_name>/device.mk
de tu 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 app de Cámara en la imagen del sistema de tu dispositivo, especifícala en la variable
PRODUCT_PACKAGES
del archivodevice/<company>/<device>/device.mk
Makefile de tu dispositivo:PRODUCT_PACKAGES := \ Gallery2 \ ...