
La couche d'abstraction matérielle (HAL, Hardware Abstraction Layer) de l'appareil photo d'Android connecte les API du framework d'appareil photo de niveau supérieur dans Camera2 à votre pilote et matériel d'appareil photo sous-jacents. Le sous-système de caméras inclut des implémentations pour les composants du pipeline de caméras, tandis que la HAL de caméras 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 l'appareil photo
- framework d'application
- Au niveau du framework d'application se trouve le code de l'application, qui utilise l'API Camera2 pour interagir avec le matériel de l'appareil photo. En interne, ce code appelle les interfaces Binder correspondantes pour accéder au code natif qui interagit avec la caméra.
- Aidl
- L'interface Binder 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 accéder à la caméra physique et renvoie les données utilisées pour créer les objetsCameraDevice
etCameraCaptureSession
au niveau du framework. - framework natif
- Ce framework résidant dans
frameworks/av/
fournit un équivalent natif aux classesCameraDevice
etCameraCaptureSession
. Consultez également la documentation de référence camera2 du NDK. - Interface IPC de liaison
- L'interface Binder IPC facilite la communication au-delà des limites des processus.
Plusieurs classes de binder de caméras se trouvent dans le répertoire
frameworks/av/camera/camera/aidl/android/hardware
et appellent le service de caméras.ICameraService
est l'interface du service de caméras ;ICameraDeviceUser
est l'interface d'un appareil photo spécifique ouvert ;ICameraServiceListener
etICameraDeviceCallbacks
sont les rappelsCameraService
etCameraDevice
respectifs du framework d'application. - service de caméras
- Le service de l'appareil photo, situé dans
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, est le code qui interagit avec la HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard que le service de caméras appelle et que vous devez implémenter pour que votre matériel de caméras fonctionne correctement.
Implémenter la HAL
La HAL se situe entre le pilote de la caméra et le framework Android de niveau supérieur. Elle 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 HAL de l'appareil photo sont définies dans hardware/interfaces/camera.
Un HAL binderisé typique doit implémenter les interfaces HIDL suivantes :
-
ICameraProvider
: Pour énumérer les appareils individuels et gérer leur état. -
ICameraDevice
: Interface de l'appareil photo. -
ICameraDeviceSession
: 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 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 la HAL a accès à des ressources différentes de celles du service de caméras, la limite entre les deux est considérée comme une limite de sécurité. Cela signifie que les paramètres transmis par le service de caméras sont considérés comme non fiables et non sécurisés. Pour éviter les failles de sécurité qui permettent aux pirates informatiques d'escalader les privilèges ou d'accéder à des données auxquelles ils ne sont pas censés avoir accès, la HAL de l'appareil photo doit valider les paramètres transmis par le service de l'appareil photo à la HAL. Cela inclut la vérification que les valeurs de longueur du tampon se trouvent dans les plages autorisées et la désinfection des paramètres avant utilisation et avant de les transmettre aux pilotes matériels ou du noyau.
Anciens composants HAL
Cette section décrit l'architecture des anciens composants HAL et explique comment implémenter le HAL. Les implémentations de la couche HAL de l'appareil photo sur Android 8.0 et versions ultérieures doivent utiliser l'API HIDL décrite ci-dessus.
Architecture (ancienne version)
La figure et la liste suivantes décrivent les anciens composants HAL de l'appareil photo.

Figure 2. Ancienne architecture de caméras
- framework d'application
- Au niveau du framework d'application se trouve le code de l'application, qui utilise l'API
android.hardware.Camera
pour interagir avec le matériel de l'appareil photo. 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 accéder à la caméra physique et renvoie les données utilisées pour créer l'objetandroid.hardware.Camera
au niveau du framework. - framework natif
- Le framework natif défini dans
frameworks/av/camera/Camera.cpp
fournit un équivalent natif à la classeandroid.hardware.Camera
. Cette classe appelle les proxys de binder IPC pour obtenir l'accès au service de l'appareil photo. - Proxys IPC Binder
- Les proxys de binder IPC facilitent la communication au-delà des limites de processus.
Le répertoire
frameworks/av/camera
contient trois classes de binder de caméras qui appellent le service de caméras.ICameraService
est l'interface du service de caméras,ICamera
est l'interface d'un appareil photo spécifique ouvert etICameraClient
est l'interface de l'appareil vers le framework d'application. - service de caméras
- Le service de l'appareil photo, situé dans
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, est le code qui interagit avec la HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard que le service de caméras appelle et que vous devez implémenter pour que votre matériel de caméras 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 la HAL. La caméra et le pilote doivent être compatibles avec 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émenter la couche d'abstraction du matériel (ancienne méthode)
La HAL se situe entre le pilote de la caméra et le framework Android de niveau supérieur. Elle 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 son ID et les propriétés communes à toutes les caméras (c'est-à-dire si elle est orientée vers l'avant ou vers l'arrière).
camera.h
contient le 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 les 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, consultez 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 la HAL.
Pour obtenir un exemple d'implémentation HAL, consultez l'implémentation pour le Galaxy Nexus HAL dans hardware/ti/omap4xxx/camera
.
Configurer la bibliothèque partagée
Configurez le système de compilation Android pour qu'il empaquète correctement l'implémentation HAL dans une bibliothèque partagée et la copie à l'emplacement approprié en créant un fichier Android.mk
:
- Créez un répertoire
device/<company_name>/<device_name>/camera
pour contenir les fichiers sources de votre bibliothèque. - Créez un fichier
Android.mk
pour compiler la bibliothèque partagée. Assurez-vous que le fichier 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) pour qu'Android puisse la charger correctement. Pour voir un exemple, consultez le fichier makefile de l'appareil photo 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é nécessaires dans le répertoire
frameworks/native/data/etc
avec le fichier makefile de votre appareil. Par exemple, pour indiquer que votre appareil dispose d'un flash et peut faire la mise au point automatique, ajoutez les lignes suivantes dans le fichier 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 obtenir un exemple de fichier make d'appareil, consultez
device/samsung/tuna/device.mk
. - Déclarez les capacités de codec, de format et de résolution multimédias 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 en savoir plus, consultez Exposer les codecs au framework. - Ajoutez les lignes suivantes au fichier make
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 \ ...