La couche d'abstraction matérielle (HAL, Hardware Abstraction Layer) de l'appareil photo d'Android connecte les API de framework de l'appareil photo de niveau supérieur dans Camera 2 à votre pilote et matériel d'appareil photo sous-jacents. Le sous-système de l'appareil photo inclut des implémentations pour les composants du pipeline de l'appareil photo, tandis que la HAL de l'appareil photo 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 Camera 2 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 l'appareil photo.
- AIDL
- L'interface Binder associée à
CameraServicese trouve dans frameworks/av/camera/aidl/android/hardware. Le code généré appelle le code natif de niveau inférieur pour accéder à l' appareil photo physique et renvoie les données utilisées pour créer lesCameraDeviceet, à terme,CameraCaptureSessionobjets au niveau du framework. - framework natif
- Ce framework résidant dans
frameworks/av/fournit un équivalent natif desCameraDeviceetCameraCaptureSessionclasses. Consultez également la documentation de référence sur l'appareil photo NDK 2. - interface IPC Binder
- L'interface IPC Binder facilite la communication au-delà des limites des processus.
Plusieurs classes Binder d'appareil photo se trouvent dans le
frameworks/av/camera/camera/aidl/android/hardwarerépertoire qui appelle le service d'appareil photo.ICameraServiceest l'interface du service d'appareil photo ;ICameraDeviceUserest l'interface d'un appareil photo ouvert spécifique ; etICameraServiceListeneretICameraDeviceCallbackssont les rappelsCameraServiceetCameraDevicerespectifs du framework d'application. - service d'appareil photo
- Le service d'appareil photo, situé dans
frameworks/av/services/camera/libcameraservice/CameraService.cpp, est le code réel qui interagit avec la HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard que le service d'appareil photo appelle et que vous devez implémenter pour que votre matériel d'appareil photo fonctionne correctement.
Implémenter la HAL
La HAL se situe entre le pilote de l'appareil photo et le framework Android de niveau supérieur, et définit une interface que vous devez implémenter pour que les applications puissent utiliser correctement le matériel de l'appareil photo. Les interfaces HIDL pour la HAL de l'appareil photo sont définies dans hardware/interfaces/camera.
Une HAL Binder standard 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 d'appareil photo active.
Des implémentations HIDL de référence sont disponibles pour
CameraProvider.cpp,
CameraDevice.cpp, et
CameraDeviceSession.cpp.
L'implémentation encapsule les anciennes HAL qui utilisent encore l'
ancienne API.
À partir d'Android 8.0, les implémentations de la HAL de l'appareil photo doivent utiliser l'API HIDL. L'utilisation de l'ancienne interface n'est pas prise en charge.
Validation des entrées
Comme la HAL a accès à différentes ressources que le service d'appareil photo, la limite entre les deux est traitée comme une limite de sécurité. Cela signifie que les paramètres transmis par le service d'appareil photo sont considérés comme non approuvés et non nettoyés. Pour éviter les failles de sécurité qui permettent aux pirates informatiques d'élever leurs 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 d'appareil photo à la HAL. Cela inclut la vérification que les valeurs de longueur du tampon se trouvent dans les plages autorisées et le nettoyage des paramètres avant utilisation et avant de les transmettre aux pilotes matériels ou de noyau.
HAL héritée
Cette section décrit l'architecture des composants HAL hérités et comment implémenter la HAL. Les implémentations de la HAL de l'appareil photo sur Android 8.0 ou version ultérieure doivent utiliser l'API HIDL, décrite ci-dessus.
Architecture (héritée)
La figure et la liste suivantes décrivent les composants HAL hérités de l'appareil photo :
Figure 2. Architecture héritée de l'appareil photo.
- framework d'application
- Au niveau du framework d'application se trouve le code de l'application, qui utilise l'
android.hardware.CameraAPI pour interagir avec le matériel de l'appareil photo. En interne, ce code appelle une classe de colle JNI correspondante pour accéder au code natif qui interagit avec l' appareil photo. - JNI
- Le code JNI associé à
android.hardware.Camerase trouve dansframeworks/base/core/jni/android_hardware_Camera.cpp. Ce code appelle le code natif de niveau inférieur pour accéder à l'appareil photo physique et renvoie les données utilisées pour créer l'objetandroid.hardware.Cameraau niveau du framework. - framework natif
- Le framework natif défini dans
frameworks/av/camera/Camera.cppfournit un équivalent natif de laandroid.hardware.Cameraclasse. Cette classe appelle les proxys Binder IPC pour accéder au service d'appareil photo. - proxys IPC Binder
- Les proxys IPC Binder facilitent la communication au-delà des limites des processus.
Trois classes Binder d'appareil photo se trouvent dans le
frameworks/av/camerarépertoire qui appelle le service d'appareil photo.ICameraServiceest l'interface du service d'appareil photo,ICameraest l'interface d'un appareil photo ouvert spécifique, etICameraClientest l'interface de l'appareil vers le framework d'application. - service d'appareil photo
- Le service d'appareil photo, situé dans
frameworks/av/services/camera/libcameraservice/CameraService.cpp, est le code réel qui interagit avec la HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard que le service d'appareil photo appelle et que vous devez implémenter pour que votre matériel d'appareil photo fonctionne correctement.
- pilote de noyau
- Le pilote de l'appareil photo interagit avec le matériel de l'appareil photo et votre implémentation de la HAL. L'appareil photo et le pilote doivent être compatibles avec les formats d'image YV12 et NV21 pour permettre l'aperçu de l'image de l'appareil photo sur l' écran et l'enregistrement vidéo.
Implémenter la HAL (héritée)
La HAL se situe entre le pilote de l'appareil photo et le framework Android de niveau supérieur, et définit une interface que vous devez implémenter pour que les applications puissent utiliser correctement le matériel de l'appareil photo. 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 l'appareil photo, telles que son ID et les propriétés communes à tous les appareils photo (c'est-à-dire s'il s'agit d'un appareil photo avant ou arrière).
camera.h contient le code correspondant à
android.hardware.Camera. Ce fichier d'en-tête déclare une
camera_device structure qui contient à son tour une
camera_device_ops structure avec des pointeurs vers des fonctions qui implémentent
l'interface HAL. Pour obtenir de la documentation sur les paramètres de l'appareil photo 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 de la HAL Galaxy Nexus dans hardware/ti/omap4xxx/camera.
Configurer la bibliothèque partagée
Configurez le système de compilation Android pour empaqueter correctement l'implémentation HAL dans une bibliothèque partagée et la copier à l'emplacement approprié en créant un fichier Android.mk :
- Créez un
device/<company_name>/<device_name>/camerarépertoire pour contenir les fichiers sources de votre bibliothèque. - Créez un fichier
Android.mkpour 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>(.soest ajoutée automatiquement) afin qu'Android puisse charger la bibliothèque correctement. Pour obtenir 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 d'appareil photo en copiant les fichiers XML de fonctionnalité nécessaires dans le répertoire
frameworks/native/data/etcavec le fichier makefile de votre appareil. Par exemple, pour spécifier que votre appareil dispose d'un flash de l'appareil photo et peut effectuer l'autofocus, ajoutez les lignes suivantes dans le fichier makefile<device>/<company_name>/<device_name>/device.mkde 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 makefile d'appareil, consultez
device/samsung/tuna/device.mk. - Déclarez les capacités de codec média, de format et de résolution de votre appareil photo dans
device/<company_name>/<device_name>/media_profiles.xmletdevice/<company_name>/<device_name>/media_codecs.xmlfichiers XML. Pour en savoir plus, consultez la section Exposer les codecs au framework. - Ajoutez les lignes suivantes dans le fichier makefile
de votre appareil
pour copier les fichiers
media_profiles.xmletmedia_codecs.xmlà l'emplacement approprié :device/<company_name>/<device_name>/device.mk# 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
PRODUCT_PACKAGESvariable du fichier makefiledevice/<company>/<device>/device.mkde votre appareil :PRODUCT_PACKAGES := \ Gallery2 \ ...