La couche d'abstraction matérielle (HAL) de l'appareil photo d'Android connecte le haut niveau du framework d'appareil photo <ph type="x-smartling-placeholder"></ph> Camera 2 au pilote de caméra et au matériel sous-jacents. Le sous-système de l'appareil photo inclut des implémentations pour les composants du pipeline de caméra, tandis que la couche d'abstraction de la caméra fournit des interfaces pour l'implémentation de votre version de ces composants.
Architecture
La figure et la liste suivantes décrivent les composants HAL.
- framework d'application
- Le code de l'application se trouve au niveau du framework d'application. <ph type="x-smartling-placeholder"></ph> l'API Camera 2 pour interagir avec les composants matériels de l'appareil photo. En interne, ce code appels correspondants <ph type="x-smartling-placeholder"></ph> Binder pour accéder au code natif qui interagit avec caméra.
- AIDL
- L'interface de liaison associée à
CameraService
peut être trouvé à <ph type="x-smartling-placeholder"></ph> frameworks/av/camera/aidl/android/hardware. Le code généré appelle le code natif de niveau inférieur pour obtenir l'accès au une caméra physique et renvoie les données utilisées pour créer <ph type="x-smartling-placeholder"></ph>CameraDevice
et éventuellement <ph type="x-smartling-placeholder"></ph>CameraCaptureSession
au niveau du framework. - framework natif
- Ce framework situé dans
frameworks/av/
fournit un natif équivalent au <ph type="x-smartling-placeholder"></ph>CameraDevice
etCameraCaptureSession
classes. Voir aussi <ph type="x-smartling-placeholder"></ph> Documentation de référence sur NDK camera2 - Interface IPC de liaison
- L'interface de liaison d'IPC facilite la communication sur les limites des processus.
Plusieurs classes de liaison de caméra sont situées dans
Répertoire
frameworks/av/camera/camera/aidl/android/hardware
qui au service de caméra. <ph type="x-smartling-placeholder"></ph>ICameraService
est l'interface du service de l'appareil photo. <ph type="x-smartling-placeholder"></ph>ICameraDeviceUser
est l'interface d'un conteneur ouvert appareil photo etICameraServiceListener
etICameraDeviceCallbacks
sont les RappelsCameraService
etCameraDevice
à la framework d'application. - service de caméra
- Le service de caméra, situé à
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, est le code qui interagit avec le HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard et que vous devez implémenter pour que votre caméra le matériel 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 à implémenter pour que les applications puissent fonctionner correctement. le matériel de l'appareil photo. Le HIDL pour la couche d'abstraction de la caméra sont définies <ph type="x-smartling-placeholder"></ph> matériel/interfaces/caméra.
Un HAL lié typique doit implémenter les interfaces HIDL suivantes:
- <ph type="x-smartling-placeholder"></ph>
ICameraProvider
: Pour énumérer des appareils individuels et gérer leur état. - <ph type="x-smartling-placeholder"></ph>
ICameraDevice
: Interface de la caméra. - <ph type="x-smartling-placeholder"></ph>
ICameraDeviceSession
: Interface de la session de l'appareil photo actif.
Les implémentations HIDL de référence sont disponibles pour
CameraProvider.cpp
,
<ph type="x-smartling-placeholder"></ph>
CameraDevice.cpp
et
CameraDeviceSession.cpp
L'implémentation encapsule les anciennes HAL qui utilisent toujours
ancienne API.
À partir d'Android 8.0, les implémentations HAL de l'appareil photo doivent utiliser l'API HIDL. utiliser
de l'ancienne interface n'est pas prise en charge.
Validation des entrées
Comme le HAL a accès à des ressources différentes de celles du service de caméra, la limite entre les deux sont traités comme une limite de sécurité. Cela signifie que les paramètres transmis par le service d'appareil photo considérés comme non fiables et non rectifiés. Pour prévenir les failles de sécurité qui permettent aux pirates informatiques élever des privilèges ou accéder à des données auxquelles ils ne sont pas censés avoir accès, le HAL de la caméra doit valider les paramètres transmis par le service d'appareil photo au HAL. Cela inclut la vérification de l'état les valeurs de longueur se situent dans les plages autorisées et nettoient les paramètres avant utilisation et avant en les transmettant aux pilotes du matériel ou du noyau.
Anciens composants HAL
Cette section décrit l'architecture des anciens composants HAL et explique comment pour implémenter le HAL. Sous Android 8.0 ou version ultérieure, les implémentations HAL de la caméra 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.
- framework d'application
- Le code de l'application se trouve au niveau du framework d'application.
<ph type="x-smartling-placeholder"></ph>
android.hardware.Camera
pour interagir avec le matériel de l'appareil photo. En interne, ce code appelle la classe Glue JNI correspondante pour accéder au code natif qui interagit avec caméra. - JNI
- Code JNI associé à
<ph type="x-smartling-placeholder"></ph>
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 à l'appareil photo physique et renvoie les données permettant de créer <ph type="x-smartling-placeholder"></ph>android.hardware.Camera
au niveau du framework. - framework natif
- Framework natif défini dans
frameworks/av/camera/Camera.cpp
fournit un équivalent natif <ph type="x-smartling-placeholder"></ph>android.hardware.Camera
. Cette classe appelle l'IPC des proxys de liaison pour accéder au service de l’appareil photo. - proxys IPC de liaison
- Les proxys de liaison IPC facilitent la communication sur les limites des processus.
Trois classes de liaison de caméra sont situées dans
Répertoire
frameworks/av/camera
qui appelle le service de caméra.ICameraService
est l'interface du service de l'appareil photo.ICamera
est l'interface d'un appareil photo ouvert spécifique, etICameraClient
est l'interface de l'appareil framework d'application. - service de caméra
- Le service de caméra, situé à
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, est le code qui interagit avec le HAL. - HAL
- La couche d'abstraction matérielle définit l'interface standard et que vous devez implémenter pour que votre caméra le matériel fonctionne correctement.
- pilote de noyau
- Le pilote de la caméra interagit avec le matériel et votre l'implémentation de l'HAL. La caméra et le pilote doivent être compatibles avec les modèles YV12 et NV21 d'image pour pouvoir prévisualiser l'image de l'appareil photo sur le display et vidéo.
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 à implémenter pour que les applications puissent fonctionner correctement.
le matériel de l'appareil photo. L'interface HAL est définie dans
hardware/libhardware/include/hardware/camera.h
et
hardware/libhardware/include/hardware/camera_common.h
.
camera_common.h
définit camera_module
, une valeur
pour obtenir des informations générales sur la caméra, telles que son identifiant
et les propriétés communes à toutes les caméras (qu'il s'agisse d'une caméra frontale
caméra arrière).
camera.h
contient du code correspondant à
<ph type="x-smartling-placeholder"></ph>
android.hardware.Camera
Ce fichier d'en-tête déclare
Structure camera_device
contenant à son tour un
Structure camera_device_ops
avec des pointeurs vers des fonctions qui implémentent
l'interface HAL. Pour accéder à la documentation sur les paramètres de l'appareil photo, les développeurs peuvent
définie, reportez-vous à frameworks/av/include/camera/CameraParameters.h
.
Ces paramètres sont définis avec la fonction indiquée par int
(*set_parameters)(struct camera_device *, const char *parms)
dans le HAL.
Pour obtenir un exemple d'implémentation HAL, reportez-vous à l'implémentation de l'API
Galaxy Nexus HAL dans hardware/ti/omap4xxx/camera
.
Configurer la bibliothèque partagée
Configurer le système de compilation Android pour empaqueter correctement l'implémentation HAL
dans une bibliothèque partagée et copiez-le à l'emplacement approprié en créant une
Fichier Android.mk
:
- Créer un
device/<company_name>/<device_name>/camera
contenant les fichiers sources de votre bibliothèque. - Créez un fichier
Android.mk
pour créer la bibliothèque partagée. Assurez-vous que que le fichier makefile contienne 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 obtenir 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 des fonctionnalités de l'appareil photo en copiant le fichier XML des fonctionnalités nécessaires
les fichiers du répertoire
frameworks/native/data/etc
avec votre le fichier makefile de l'appareil. Par exemple, pour indiquer que votre appareil est équipé d'un flash d'appareil photo vous pouvez effectuer la mise au point automatique, ajoutez les lignes suivantes dans le<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 \
Pour obtenir un exemple de fichier makefile d'un appareil, consultez
device/samsung/tuna/device.mk
- Déclarez le codec multimédia, le format et les capacités de résolution de votre caméra au format
device/<company_name>/<device_name>/media_profiles.xml
etdevice/<company_name>/<device_name>/media_codecs.xml
XML. Pour en savoir plus, consultez Exposer les codecs au framework. - Ajoutez les lignes suivantes dans le fichier
Fichier makefile
device/<company_name>/<device_name>/device.mk
pour copiermedia_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, indiquez-la dans le
la variable
PRODUCT_PACKAGES
dans le fichierdevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...