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.
- 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 laCameraDevice
y, finalmente,CameraCaptureSession
a nivel del framework. - framework nativo
- Este framework, alojado en
frameworks/av/
, proporciona un equivalente nativo alCameraDevice
yCameraCaptureSession
. 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; yICameraServiceListener
yICameraDeviceCallbacks
son las respectivasCameraService
yCameraDevice
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:
-
ICameraProvider
Para enumerar dispositivos individuales y administrar sus estados. -
ICameraDevice
La interfaz del dispositivo de la cámara -
ICameraDeviceSession
La interfaz de la sesión del dispositivo de cámara activa.
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.
- 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 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 los datos que se usan para crear la Un objetoandroid.hardware.Camera
a nivel del framework. - framework nativo
- El marco de trabajo nativo definido en
frameworks/av/camera/Camera.cpp
proporciona un equivalente nativo alandroid.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ámaraICameraService
es la interfaz para el servicio de cámara.ICamera
es la interfaz de un dispositivo de cámara específico abierto. yICameraClient
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
:
- Crea un
device/<company_name>/<device_name>/camera
para que contenga los archivos de origen de la biblioteca. - 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 lahardware/ti/omap4xxx/Android.mk
- 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
- 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
ydevice/<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. - Agrega las siguientes líneas al directorio
Archivo makefile de
device/<company_name>/<device_name>/device.mk
para copiarmedia_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 de sistema del dispositivo, especifícala en el
La variable
PRODUCT_PACKAGES
en la configuracióndevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...