
La couche d'abstraction du matériel de caméra (HAL) d'Android connecte les API de cadre de caméra de niveau supérieur dans Camera 2 à votre pilote de caméra et à votre matériel sous-jacents. Le sous-système de caméra comprend des implémentations pour les composants de pipeline de caméra tandis que la caméra HAL fournit des interfaces à utiliser pour implémenter votre version de ces composants.
Architecture
La figure et la liste suivantes décrivent les composants HAL.

Figure 1. Architecture de la caméra
- cadre d'application
- Au niveau de la structure de l'application se trouve le code de l'application, qui utilise l'API Camera 2 pour interagir avec le matériel de la caméra. En interne, ce code appelle les interfaces Binder correspondantes pour accéder au code natif qui interagit avec la caméra.
- AIDL
- L'interface de classeur associée à
CameraService
se trouve dans frameworks/av/camera/aidl/android/hardware . Le code généré appelle le code natif de niveau inférieur pour obtenir l'accès à la caméra physique et renvoie les données utilisées pour créer lesCameraDevice
et éventuellementCameraCaptureSession
au niveau de la structure. - cadre natif
- Ce framework résidant dans
frameworks/av/
fournit un équivalent natif aux classesCameraDevice
etCameraCaptureSession
. Voir aussi NDK camera2 reference . - interface IPC du classeur
- L'interface de classeur IPC facilite la communication au-delà des limites de processus. Il existe plusieurs classes de classeur de caméra situées dans le répertoire
frameworks/av/camera/camera/aidl/android/hardware
qui appellent le service de caméra.ICameraService
est l'interface avec le service de caméra ;ICameraDeviceUser
est l'interface avec un appareil photo ouvert spécifique ; etICameraServiceListener
etICameraDeviceCallbacks
sont lesCameraService
etCameraDevice
respectifs au framework d'application. - service de caméra
- Le service de caméra, situé dans
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, est le code réel qui interagit avec HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard à laquelle le service de caméra fait appel et que vous devez implémenter pour que le matériel de votre caméra fonctionne correctement.
Implémentation de la HAL
Le HAL se situe entre le pilote de la caméra et le framework Android de niveau supérieur et définit une interface que vous devez implémenter pour que les applications puissent faire fonctionner correctement le matériel de la caméra. Les interfaces HIDL pour la caméra HAL sont définies dans hardware/interfaces/camera .
Un HAL binderisé typique doit implémenter les interfaces HIDL suivantes :
-
ICameraProvider
: pour énumérer les périphériques individuels et gérer leur état. -
ICameraDevice
: L'interface de l'appareil photo. -
ICameraDeviceSession
: L'interface de session de l'appareil photo actif.
Des implémentations HIDL de référence sont disponibles pour CameraProvider.cpp
, CameraDevice.cpp
et CameraDeviceSession.cpp
. L'implémentation encapsule les anciens HAL qui utilisent encore l' ancienne API . À partir d'Android 8.0, les implémentations de Camera HAL doivent utiliser l'API HIDL ; l'utilisation de l'ancienne interface n'est pas prise en charge.
Validation des entrées
Étant donné que HAL a accès à des ressources différentes de celles du service de caméra, la frontière entre les deux est traitée comme une frontière de sécurité. Cela signifie que les paramètres transmis par le service de caméra sont considérés comme non fiables et non nettoyés. Pour empêcher les vulnérabilités de sécurité qui permettent aux attaquants d'élever les privilèges ou d'accéder aux données auxquelles ils ne sont pas censés avoir accès, la caméra HAL doit valider les paramètres transmis du service de caméra à la HAL. Cela inclut la vérification que les valeurs de longueur de mémoire tampon se situent dans les plages autorisées et le nettoyage des paramètres avant utilisation et avant de les transmettre aux pilotes matériels ou du noyau.
Composants HAL hérités
Cette section décrit l'architecture des composants HAL hérités et comment implémenter HAL. Les implémentations Camera HAL sur Android 8.0 et versions ultérieures doivent utiliser l'API HIDL à la place, décrite ci-dessus.
Architecture (héritage)
La figure et la liste suivantes décrivent les composants HAL de caméra hérités.

Figure 2. Architecture de caméra héritée
- cadre d'application
- Au niveau de la structure de l'application se trouve le code de l'application, qui utilise l'API
android.hardware.Camera
pour interagir avec le matériel de la caméra. En interne, ce code appelle une classe glue JNI correspondante pour accéder au code natif qui interagit avec la caméra. - JNI
- Le code JNI associé à
android.hardware.Camera
se trouve dansframeworks/base/core/jni/android_hardware_Camera.cpp
. Ce code appelle le code natif de niveau inférieur pour obtenir l'accès à la caméra physique et renvoie les données utilisées pour créer l'objetandroid.hardware.Camera
au niveau du framework. - cadre natif
- Le framework natif défini dans
frameworks/av/camera/Camera.cpp
fournit un équivalent natif à la classeandroid.hardware.Camera
. Cette classe appelle les proxies de classeur IPC pour obtenir l'accès au service de caméra. - liant proxys IPC
- Les proxys de classeur IPC facilitent la communication au-delà des frontières de processus. Il existe trois classes de classeur de caméra situées dans le répertoire
frameworks/av/camera
qui appelle le service de caméra.ICameraService
est l'interface avec le service de caméra,ICamera
est l'interface avec un appareil photo ouvert spécifique etICameraClient
est l'interface de l'appareil avec le framework de l'application. - service de caméra
- Le service de caméra, situé dans
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, est le code réel qui interagit avec HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard à laquelle le service de caméra fait appel et que vous devez implémenter pour que le matériel de votre caméra fonctionne correctement.
- pilote du noyau
- Le pilote de la caméra interagit avec le matériel de la caméra et votre implémentation de HAL. La caméra et le pilote doivent prendre en charge les formats d'image YV12 et NV21 pour permettre la prévisualisation de l'image de la caméra sur l'écran et l'enregistrement vidéo.
Implémentation de HAL (héritage)
Le HAL se situe entre le pilote de la caméra et le framework Android de niveau supérieur et définit une interface que vous devez implémenter pour que les applications puissent faire fonctionner correctement le matériel de la caméra. L'interface HAL est définie dans les fichiers d'en-tête hardware/libhardware/include/hardware/camera.h
et hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
définit camera_module
, une structure standard permettant d'obtenir des informations générales sur la caméra, telles que l'ID de la caméra et les propriétés communes à toutes les caméras (c'est-à-dire, qu'il s'agisse d'une caméra orientée vers l'avant ou vers l'arrière).
camera.h
contient du code qui correspond à android.hardware.Camera
. Ce fichier d'en-tête déclare une structure camera_device
qui contient à son tour une structure camera_device_ops
avec des pointeurs vers des fonctions qui implémentent l'interface HAL. Pour obtenir de la documentation sur les paramètres de caméra que les développeurs peuvent définir, reportez-vous à frameworks/av/include/camera/CameraParameters.h
. Ces paramètres sont définis avec la fonction pointée par int (*set_parameters)(struct camera_device *, const char *parms)
dans HAL.
Pour un exemple d'implémentation HAL, reportez-vous à l'implémentation pour le Galaxy Nexus HAL dans hardware/ti/omap4xxx/camera
.
Configuration de la bibliothèque partagée
Configurez le système de build Android pour empaqueter correctement l'implémentation HAL dans une bibliothèque partagée et copiez-la à l'emplacement approprié en créant un fichier Android.mk
:
- Créez un
device/<company_name>/<device_name>/camera
pour contenir les fichiers sources de votre bibliothèque. - Créez un fichier
Android.mk
pour créer la bibliothèque partagée. Assurez-vous que le makefile contient les lignes suivantes :LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Votre bibliothèque doit être nommée
camera.<device_name>
(.so
est ajouté automatiquement), afin qu'Android puisse charger correctement la bibliothèque. Pour un exemple, consultez le makefile de la caméra Galaxy Nexus situé danshardware/ti/omap4xxx/Android.mk
. - Spécifiez que votre appareil dispose de fonctionnalités de caméra en copiant les fichiers XML de fonctionnalités nécessaires dans le répertoire
frameworks/native/data/etc
avec le makefile de votre appareil. Par exemple, pour spécifier que votre appareil dispose d'un flash d'appareil photo et peut effectuer une mise au point automatique, ajoutez les lignes suivantes dans le makefile<device>/<company_name>/<device_name>/device.mk
de votre appareil :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 \
Pour un exemple de makefile de périphérique, voir
device/samsung/tuna/device.mk
. - Déclarez les capacités de codec multimédia, de format et de résolution de votre caméra dans les fichiers XML
device/<company_name>/<device_name>/media_profiles.xml
etdevice/<company_name>/<device_name>/media_codecs.xml
. Pour plus de détails, voir Exposer les codecs au framework . - Ajoutez les lignes suivantes dans le makefile
device/<company_name>/<device_name>/device.mk
de votre appareil pour copier les fichiersmedia_profiles.xml
etmedia_codecs.xml
à l'emplacement approprié :# 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
- Pour inclure l'application Appareil photo dans l'image système de votre appareil, spécifiez-la dans la variable
PRODUCT_PACKAGES
du fichier makefiledevice/<company>/<device>/device.mk
de votre appareil :PRODUCT_PACKAGES := \ Gallery2 \ ...