![Icône HAL de la caméra Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=1&hl=fr)
La couche d'abstraction matérielle de l'appareil photo (HAL) d'Android connecte les API de framework d'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 le 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.
![Architecture de l'appareil photo Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=1&hl=fr)
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 la caméra.
- AIDL
- L'interface de liaison associée à
CameraService
se trouve sur 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 les objetsCameraDevice
et éventuellementCameraCaptureSession
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 sur Camera2 du NDK. - Interface IPC de liaison
- L'interface de liaison IPC facilite la communication au-delà des limites de processus.
Plusieurs classes de liaison de caméra se trouvent dans le répertoire
frameworks/av/camera/camera/aidl/android/hardware
et appellent le service de caméra.ICameraService
est l'interface du service d'appareil photo.ICameraDeviceUser
est l'interface d'un appareil photo ouvert spécifique.ICameraServiceListener
etICameraDeviceCallbacks
sont les rappelsCameraService
etCameraDevice
respectifs du 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 le HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard que le service de caméra appelle et que vous devez implémenter pour que le matériel de votre caméra fonctionne correctement.
Implémenter le HAL
Le 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 le HAL de l'appareil photo sont définies dans hardware/interfaces/camera.
Un HAL lié typique doit implémenter les interfaces HIDL suivantes:
-
ICameraProvider
: pour énumérer des 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 toujours l'ancienne API.
À partir d'Android 8.0, les implémentations 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
Étant donné que le HAL a accès à des ressources différentes de celles du service de caméra, la limite entre les deux est traitée comme une limite de sécurité. Cela signifie que les paramètres transmis par le service de caméra 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 les droits d'accès ou d'accéder à des données auxquelles ils ne sont pas censés avoir accès, le HAL de l'appareil photo doit valider les paramètres transmis du service de l'appareil photo au HAL. Cela inclut la vérification que les valeurs de longueur de tampon se trouvent dans les plages autorisées et la validation des paramètres avant utilisation et avant de les transmettre aux pilotes matériels ou du noyau.
Composants HAL anciens
Cette section décrit l'architecture des anciens composants HAL et explique comment implémenter le HAL. Les implémentations HAL de l'appareil photo sur Android 8.0 ou version ultérieure doivent utiliser l'API HIDL, décrite ci-dessus.
Architecture (ancienne)
La figure et la liste suivantes décrivent les anciens composants HAL de la caméra.
![Architecture de l'appareil photo Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera.png?authuser=1&hl=fr)
Figure 2. Ancienne architecture de la caméra
- framework d'application
- Au niveau du framework de l'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 de liaison 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. - 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 proxy de liaison IPC pour obtenir l'accès au service d'appareil photo. - Proxys IPC du liaisonneur
- Les proxy de liaison IPC facilitent la communication au-delà des limites de processus.
Trois classes de liaison de caméra se trouvent dans le répertoire
frameworks/av/camera
, qui appelle le service de caméra.ICameraService
est l'interface du service d'appareil photo,ICamera
est l'interface d'un appareil photo ouvert spécifique, etICameraClient
est l'interface de l'appareil vers le 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 le HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard que le service de l'appareil photo appelle et que vous devez implémenter pour que le matériel de l'appareil photo fonctionne correctement.
- pilote de kernel
- Le pilote de l'appareil photo interagit avec le matériel de l'appareil photo et votre implémentation du HAL. L'appareil photo et le pilote doivent prendre en charge les formats d'image YV12 et NV21 pour permettre d'afficher un aperçu de l'image de l'appareil photo à l'écran et d'enregistrer des vidéos.
Implémenter le HAL (ancien)
Le 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 la caméra, telles que l'ID de la caméra et les propriétés communes à toutes les caméras (c'est-à-dire s'il s'agit d'une caméra avant ou 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 implémentant l'interface HAL. Pour en savoir plus sur les paramètres de la 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 le HAL.
Pour obtenir un exemple d'implémentation de HAL, consultez l'implémentation du 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 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 du 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és nécessaires dans le répertoire
frameworks/native/data/etc
avec le fichier makefile de votre appareil. Par exemple, pour spécifier que votre appareil dispose d'un flash et peut effectuer la mise au point automatique, ajoutez les lignes suivantes dans le fichier de compilation<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 de compilation d'appareil, consultez
device/samsung/tuna/device.mk
. - Déclarez les fonctionnalités de codec multimédia, de format et de résolution de votre appareil photo 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 la section Exposer des codecs au framework. - Ajoutez les lignes suivantes dans le fichier de compilation
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 de compilationdevice/<company>/<device>/device.mk
de votre appareil:PRODUCT_PACKAGES := \ Gallery2 \ ...