Die Hardwareabstraktionsschicht (Hardware Abstraction Layer, HAL) der Kamera von Android verbindet die Kamera-Framework-APIs der höheren Ebene in Camera 2 mit dem zugrunde liegenden Kameratreiber und der Hardware. Das Kamerasubsystem umfasst Implementierungen für Komponenten der Kamerapipeline, während die Kamera-HAL Schnittstellen für die Implementierung Ihrer Version dieser Komponenten bietet.
Architektur
Die folgende Abbildung und Liste beschreiben die HAL-Komponenten.
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 Kamerahardware zu interagieren. Intern ruft dieser Code entsprechende Binder-Schnittstellen auf, um auf den nativen Code zuzugreifen, der mit der Kamera interagiert.
- AIDL
- Die mit
CameraServiceverknüpfte Binder-Schnittstelle finden Sie unter frameworks/av/camera/aidl/android/hardware. Der generierte Code ruft den nativen Code der niedrigeren Ebene auf, um Zugriff auf die physische Kamera zu erhalten, und gibt Daten zurück, die zum Erstellen derCameraDeviceund schließlichCameraCaptureSessionObjekte auf Framework-Ebene verwendet werden. - Natives Framework
- Dieses Framework in
frameworks/av/bietet ein natives Äquivalent zu denCameraDeviceundCameraCaptureSessionKlassen. Siehe auch NDK Camera2-Referenz. - Binder-IPC-Schnittstelle
- Die IPC-Binder-Schnittstelle ermöglicht die Kommunikation über Prozessgrenzen hinweg.
Es gibt mehrere Kamera-Binder-Klassen im
frameworks/av/camera/camera/aidl/android/hardwareVerzeichnis, die den Kameradienst aufrufen.ICameraServiceist die Schnittstelle zum Kameradienst;ICameraDeviceUserist die Schnittstelle zu einem bestimmten geöffneten Kameragerät undICameraServiceListenerundICameraDeviceCallbackssind die entsprechendenCameraServiceundCameraDeviceCallbacks zum App-Framework. - Kameradienst
- Der Kameradienst in
frameworks/av/services/camera/libcameraservice/CameraService.cpp, ist der tatsächliche Code, der mit der HAL interagiert. - HAL
- Die Hardwareabstraktionsschicht definiert die Standardschnittstelle, die vom Kameradienst aufgerufen wird und die Sie implementieren müssen, damit Ihre Kamera Hardware ordnungsgemäß funktioniert.
HAL implementieren
Die HAL befindet sich zwischen dem Kameratreiber und dem Android-Framework der höheren Ebene und definiert eine Schnittstelle, die Sie implementieren müssen, damit Apps die Kamerahardware korrekt bedienen können. Die HIDL Schnittstellen für die Kamera-HAL sind in hardware/interfaces/camera definiert.
Eine typische Binder-HAL muss die folgenden HIDL-Schnittstellen implementieren:
-
ICameraProvider: Zum Auflisten einzelner Geräte und Verwalten ihres Status. -
ICameraDevice: Die Schnittstelle des Kamerageräts. -
ICameraDeviceSession: Die Schnittstelle der aktiven Kameragerätesitzung.
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 die HAL Zugriff auf andere Ressourcen als der Kameradienst hat, wird die Grenze zwischen den beiden als Sicherheitsgrenze behandelt. Das bedeutet, dass Parameter, die vom Kameradienst übergeben werden, 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 sollten, muss die Kamera-HAL Parameter validieren, die vom Kameradienst an die HAL übergeben werden. Dazu gehört, zu prüfen, ob die Werte für die Pufferlänge innerhalb der zulässigen Bereiche liegen, und die Parameter vor der Verwendung und vor der Übergabe an Hardware- oder Kerneltreiber zu bereinigen.
Legacy-HAL-Komponenten
In diesem Abschnitt werden die Architektur der Legacy-HAL-Komponenten und die Implementierung der HAL beschrieben. Kamera-HAL-Implementierungen unter Android 8.0 und höher müssen stattdessen die oben beschriebene HIDL-API verwenden.
Architektur (Legacy)
Die folgende Abbildung und Liste beschreiben die Legacy-Kamera-HAL-Komponenten.
Abbildung 2 : Legacy-Kameraarchitektur
- App-Framework
- Auf der Ebene des App-Frameworks befindet sich der Code der App, der die
android.hardware.CameraAPI verwendet, um mit der Kamerahardware 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.Cameraverknüpfte JNI-Code befindet sich inframeworks/base/core/jni/android_hardware_Camera.cpp. Dieser Code ruft den nativen Code der niedrigeren Ebene auf, um Zugriff auf die physische Kamera zu erhalten und gibt Daten zurück, die zum Erstellen desandroid.hardware.CameraObjekts auf Framework-Ebene verwendet werden. - Natives Framework
- Das native Framework in
frameworks/av/camera/Camera.cppbietet ein natives Äquivalent zurandroid.hardware.CameraKlasse. Diese Klasse ruft die IPC Binder-Proxys auf, um Zugriff auf den Kameradienst zu erhalten. - Binder-IPC-Proxys
- Die IPC-Binder-Proxys ermöglichen die Kommunikation über Prozessgrenzen hinweg.
Es gibt drei Kamera-Binder-Klassen im
frameworks/av/cameraVerzeichnis, die den Kameradienst aufrufen.ICameraServiceist die Schnittstelle zum Kameradienst,ICameraist die Schnittstelle zu einem bestimmten geöffneten Kameragerät, undICameraClientist die Schnittstelle des Geräts zurück zum App-Framework. - Kameradienst
- Der Kameradienst in
frameworks/av/services/camera/libcameraservice/CameraService.cpp, ist der tatsächliche Code, der mit der HAL interagiert. - HAL
- Die Hardwareabstraktionsschicht definiert die Standardschnittstelle, die vom Kameradienst aufgerufen wird und die Sie implementieren müssen, damit Ihre Kamera Hardware ordnungsgemäß funktioniert.
- Kerneltreiber
- Der Treiber der Kamera interagiert mit der tatsächlichen Kamerahardware und Ihrer Implementierung der HAL. Die Kamera und der Treiber müssen die Bildformate YV12 und NV21 unterstützen, um die Vorschau des Kamerabilds auf dem Display und die Videoaufzeichnung zu ermöglichen.
HAL implementieren (Legacy)
Die HAL befindet sich zwischen dem Kameratreiber und dem Android-Framework der höheren Ebene und definiert eine Schnittstelle, die Sie implementieren müssen, damit Apps die Kamerahardware 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 zum Abrufen allgemeiner Informationen zur Kamera, z. B. der Kamera-ID und Eigenschaften, die allen Kameras gemeinsam sind (z. B. ob es sich um eine nach vorne oder nach hinten gerichtete Kamera handelt).
camera.h enthält Code, der
android.hardware.Camera entspricht. Diese Headerdatei deklariert eine
camera_device Struktur, die wiederum eine
camera_device_ops Struktur mit Zeigern auf Funktionen enthält, die
die HAL-Schnittstelle implementieren. Die 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 von int
(*set_parameters)(struct camera_device *, const char *parms) in der HAL verwiesen wird.
Ein Beispiel für eine HAL-Implementierung finden Sie in der Implementierung für die Galaxy Nexus-HAL in hardware/ti/omap4xxx/camera.
Gemeinsame Bibliothek konfigurieren
Richten Sie das Android-Build-System so ein, dass die HAL-Implementierung korrekt in einer gemeinsamen Bibliothek verpackt und an den entsprechenden Speicherort kopiert wird. Erstellen Sie dazu eine Android.mk-Datei:
- Erstellen Sie ein
device/<company_name>/<device_name>/cameraVerzeichnis, das die Quelldateien Ihrer Bibliothek enthält. - Erstellen Sie eine
Android.mk-Datei, um die gemeinsame Bibliothek zu erstellen. Die Make-Datei muss die folgenden Zeilen enthalten:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Ihre Bibliothek muss
camera.<device_name>(.sowird automatisch angehängt) heißen, damit Android die Bibliothek korrekt laden kann. Ein Beispiel finden Sie in der Make-Datei für die Galaxy Nexus-Kamera unterhardware/ti/omap4xxx/Android.mk. - Geben Sie an, dass Ihr Gerät Kamerafunktionen hat, indem Sie die erforderlichen XML-Dateien für die Funktionen mit der Make-Datei Ihres Geräts in das Verzeichnis
frameworks/native/data/etckopieren. Wenn Sie beispielsweise angeben möchten, dass Ihr Gerät einen Kamerablitz hat und Autofokus unterstützt, fügen Sie der Make-Datei Ihres Geräts die folgenden Zeilen hinzu:<device>/<company_name>/<device_name>/device.mkPRODUCT_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 eine Make-Datei für ein Gerät finden Sie unter
device/samsung/tuna/device.mk. - Deklarieren Sie die Media-Codec-, Format- und Auflösungsfunktionen Ihrer Kamera in
device/<company_name>/<device_name>/media_profiles.xmlunddevice/<company_name>/<device_name>/media_codecs.xmlXML-Dateien. Weitere Informationen finden Sie unter Codecs für das Framework verfügbar machen. - Fügen Sie der Make-Datei
device/<company_name>/<device_name>/device.mkIhres Geräts die folgenden Zeilen hinzu, um die Dateienmedia_profiles.xmlundmedia_codecs.xmlan 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 - Wenn Sie die Kamera App in das Systemimage Ihres Geräts einbeziehen möchten, geben Sie sie in der
PRODUCT_PACKAGESVariablen in derdevice/<company>/<device>/device.mkMake-Datei Ihres Geräts an:PRODUCT_PACKAGES := \ Gallery2 \ ...