![Android-Kamera-HAL-Symbol](https://source.android.com/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=6&hl=de)
Die Kamera-Hardware-Abstraktionsschicht (HAL) von Android verbindet die übergeordneten Kamera-Framework-APIs in Kamera 2 mit Ihrem zugrunde liegenden Kameratreiber und Ihrer Hardware. Das Kamera-Subsystem umfasst Implementierungen für Kamera-Pipeline-Komponenten, während die Kamera-HAL Schnittstellen zur Verwendung bei der Implementierung Ihrer Version dieser Komponenten bereitstellt.
Die Architektur
Die folgende Abbildung und Liste beschreiben die HAL-Komponenten.
![Android-Kameraarchitektur](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=6&hl=de)
Abbildung 1. Kameraarchitektur
- App-Framework
- Auf der Ebene des App-Frameworks befindet sich der Code der App, der die Camera 2- API verwendet, um mit der Kamera-Hardware zu interagieren. Intern ruft dieser Code entsprechende Binder- Schnittstellen auf, um auf den nativen Code zuzugreifen, der mit der Kamera interagiert.
- AIDL
- Die mit
CameraService
verknüpfte Binder-Schnittstelle finden Sie unter „frameworks/av/camera/aidl/android/hardware“ . Der generierte Code ruft den nativen Code der unteren Ebene auf, um Zugriff auf die physische Kamera zu erhalten, und gibt Daten zurück, die zum Erstellen derCameraDevice
und schließlichCameraCaptureSession
Objekte auf Framework-Ebene verwendet werden. - natives Framework
- Dieses Framework befindet sich in
frameworks/av/
und bietet ein natives Äquivalent zu den KlassenCameraDevice
“ undCameraCaptureSession
“. Siehe auch NDK-Kamera2-Referenz . - binder IPC-Schnittstelle
- Die IPC-Binder-Schnittstelle erleichtert die Kommunikation über Prozessgrenzen hinweg. Im Verzeichnis
frameworks/av/camera/camera/aidl/android/hardware
befinden sich mehrere Kamera-Binder-Klassen, die den Kameradienst aufrufen.ICameraService
ist die Schnittstelle zum Kameradienst;ICameraDeviceUser
ist die Schnittstelle zu einem bestimmten geöffneten Kameragerät; undICameraServiceListener
undICameraDeviceCallbacks
sind die jeweiligenCameraService
undCameraDevice
Rückrufe an das Anwendungsframework. - Kameradienst
- Der Kameradienst, der sich in
frameworks/av/services/camera/libcameraservice/CameraService.cpp
befindet, ist der eigentliche Code, der mit der HAL interagiert. - HAL
- Die Hardware-Abstraktionsschicht definiert die Standardschnittstelle, die der Kameradienst aufruft und die Sie implementieren müssen, damit Ihre Kamera-Hardware ordnungsgemäß funktioniert.
Implementierung des HAL
Der HAL sitzt zwischen dem Kameratreiber und dem übergeordneten Android-Framework und definiert eine Schnittstelle, die Sie implementieren müssen, damit Apps die Kamera-Hardware korrekt bedienen können. Die HIDL- Schnittstellen für die Kamera-HAL sind in hardware/interfaces/camera definiert.
Ein typischer binderisierter HAL muss die folgenden HIDL-Schnittstellen implementieren:
-
ICameraProvider
: Zum Auflisten einzelner Geräte und Verwalten ihres Status. -
ICameraDevice
: Die Kamerageräteschnittstelle. -
ICameraDeviceSession
: Die Sitzungsschnittstelle des aktiven Kamerageräts.
Referenz-HIDL-Implementierungen sind für CameraProvider.cpp
, CameraDevice.cpp
und CameraDeviceSession.cpp
verfügbar. Die Implementierung umschließt alte HALs, die noch die Legacy-API verwenden. Ab Android 8.0 müssen Kamera-HAL-Implementierungen die HIDL-API verwenden; Die Verwendung der Legacy-Schnittstelle wird nicht unterstützt.
Eingabevalidierung
Da der HAL Zugriff auf andere Ressourcen hat als der Kameradienst, wird die Grenze zwischen beiden als Sicherheitsgrenze behandelt. Dies bedeutet, dass vom Kameradienst übergebene Parameter als nicht vertrauenswürdig und nicht bereinigt gelten. Um Sicherheitslücken zu vermeiden, die es Angreifern ermöglichen, Berechtigungen zu erweitern oder auf Daten zuzugreifen, auf die sie keinen Zugriff haben sollen, muss der Kamera-HAL Parameter validieren, die vom Kameradienst an den HAL übergeben werden. Dazu gehört die Überprüfung, ob die Pufferlängenwerte innerhalb zulässiger Bereiche liegen, und die Bereinigung der Parameter vor der Verwendung und vor der Weitergabe an Hardware- oder Kerneltreiber.
Ältere HAL-Komponenten
In diesem Abschnitt werden die Architektur der alten HAL-Komponenten und die Implementierung des HAL beschrieben. Kamera-HAL-Implementierungen unter Android 8.0 und höher müssen stattdessen die oben beschriebene HIDL-API verwenden.
Architektur (Erbe)
Die folgende Abbildung und Liste beschreiben die HAL-Komponenten der Legacy-Kamera.
![Android-Kameraarchitektur](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera.png?authuser=6&hl=de)
Abbildung 2. Legacy-Kameraarchitektur
- App-Framework
- Auf der App-Framework-Ebene befindet sich der Code der App, der die
android.hardware.Camera
API verwendet, um mit der Kamera-Hardware zu interagieren. Intern ruft dieser Code eine entsprechende JNI-Glue-Klasse auf, um auf den nativen Code zuzugreifen, der mit der Kamera interagiert. - JNI
- Der mit
android.hardware.Camera
verknüpfte JNI-Code befindet sich inframeworks/base/core/jni/android_hardware_Camera.cpp
. Dieser Code ruft den nativen Code der unteren Ebene auf, um Zugriff auf die physische Kamera zu erhalten, und gibt Daten zurück, die zum Erstellen desandroid.hardware.Camera
-Objekts auf Framework-Ebene verwendet werden. - natives Framework
- Das in
frameworks/av/camera/Camera.cpp
definierte native Framework bietet ein natives Äquivalent zur Klasseandroid.hardware.Camera
. Diese Klasse ruft die IPC-Binder-Proxys auf, um Zugriff auf den Kameradienst zu erhalten. - Binder IPC-Proxys
- Die IPC-Binder-Proxys erleichtern die Kommunikation über Prozessgrenzen hinweg. Es gibt drei Kamera-Binderklassen, die sich im Verzeichnis
frameworks/av/camera
befinden und den Kameradienst aufrufen.ICameraService
ist die Schnittstelle zum Kameradienst,ICamera
ist die Schnittstelle zu einem bestimmten geöffneten Kameragerät undICameraClient
ist die Schnittstelle des Geräts zurück zum App-Framework. - Kameradienst
- Der Kameradienst, der sich in
frameworks/av/services/camera/libcameraservice/CameraService.cpp
befindet, ist der eigentliche Code, der mit der HAL interagiert. - HAL
- Die Hardware-Abstraktionsschicht definiert die Standardschnittstelle, die der Kameradienst aufruft und die Sie implementieren müssen, damit Ihre Kamera-Hardware ordnungsgemäß funktioniert.
- Kernel-Treiber
- Der Treiber der Kamera interagiert mit der tatsächlichen Kamerahardware und Ihrer Implementierung des HAL. Die Kamera und der Treiber müssen die Bildformate YV12 und NV21 unterstützen, um die Vorschau des Kamerabildes auf dem Display und die Videoaufzeichnung zu unterstützen.
Implementierung des HAL (Legacy)
Der HAL sitzt zwischen dem Kameratreiber und dem übergeordneten Android-Framework und definiert eine Schnittstelle, die Sie implementieren müssen, damit Apps die Kamera-Hardware korrekt bedienen können. Die HAL-Schnittstelle ist in den Headerdateien hardware/libhardware/include/hardware/camera.h
und hardware/libhardware/include/hardware/camera_common.h
definiert.
camera_common.h
definiert camera_module
, eine Standardstruktur, um allgemeine Informationen über die Kamera zu erhalten, wie z. B. die Kamera-ID und Eigenschaften, die allen Kameras gemeinsam sind (d. h. ob es sich um eine nach vorne oder nach hinten gerichtete Kamera handelt).
camera.h
enthält Code, der android.hardware.Camera
entspricht. Diese Header-Datei deklariert eine camera_device
Struktur, die wiederum eine camera_device_ops
-Struktur mit Zeigern auf Funktionen enthält, die die HAL-Schnittstelle implementieren. Eine Dokumentation zu den Kameraparametern, die Entwickler festlegen können, finden Sie unter frameworks/av/include/camera/CameraParameters.h
. Diese Parameter werden mit der Funktion festgelegt, auf die int (*set_parameters)(struct camera_device *, const char *parms)
im HAL zeigt.
Ein Beispiel für eine HAL-Implementierung finden Sie in der Implementierung für das Galaxy Nexus HAL in hardware/ti/omap4xxx/camera
.
Konfigurieren der gemeinsam genutzten Bibliothek
Richten Sie das Android-Build-System ein, um die HAL-Implementierung korrekt in eine gemeinsam genutzte Bibliothek zu packen, und kopieren Sie sie an den entsprechenden Speicherort, indem Sie eine Android.mk
Datei erstellen:
- Erstellen Sie ein Verzeichnis
device/<company_name>/<device_name>/camera
, um die Quelldateien Ihrer Bibliothek zu enthalten. - Erstellen Sie eine
Android.mk
Datei, um die gemeinsam genutzte Bibliothek zu erstellen. Stellen Sie sicher, dass das Makefile die folgenden Zeilen enthält:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Ihre Bibliothek muss
camera.<device_name>
heißen (.so
wird automatisch angehängt), damit Android die Bibliothek korrekt laden kann. Ein Beispiel finden Sie im Makefile für die Galaxy Nexus-Kamera unterhardware/ti/omap4xxx/Android.mk
. - Geben Sie an, dass Ihr Gerät über Kamerafunktionen verfügt, indem Sie die erforderlichen XML-Funktionsdateien in das Verzeichnis
frameworks/native/data/etc
mit dem Makefile Ihres Geräts kopieren. Um beispielsweise anzugeben, dass Ihr Gerät über einen Kamerablitz verfügt und automatisch fokussieren kann, fügen Sie die folgenden Zeilen in die Makefile<device>/<company_name>/<device_name>/device.mk
Ihres Geräts ein: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 \
Ein Beispiel für ein Geräte-Makefile finden Sie unter
device/samsung/tuna/device.mk
. - Deklarieren Sie den Mediencodec, das Format und die Auflösungsfunktionen Ihrer Kamera in den XML-Dateien
device/<company_name>/<device_name>/media_profiles.xml
unddevice/<company_name>/<device_name>/media_codecs.xml
. Einzelheiten finden Sie unter Codecs dem Framework zugänglich machen . - Fügen Sie die folgenden Zeilen im Makefile
device/<company_name>/<device_name>/device.mk
Ihres Geräts hinzu, um die Dateienmedia_profiles.xml
undmedia_codecs.xml
an den entsprechenden Speicherort zu kopieren:# 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
- Um die Kamera-App in das Systemabbild Ihres Geräts aufzunehmen, geben Sie sie in der Variable
PRODUCT_PACKAGES
im Makefiledevice/<company>/<device>/device.mk
Ihres Geräts an:PRODUCT_PACKAGES := \ Gallery2 \ ...