Kamera

HAL-Symbol für Android-Kamera

Die Kamerahardware-Abstraktionsschicht (HAL) von Android verbindet die übergeordnete Kamera-Framework-APIs in <ph type="x-smartling-placeholder"></ph> Kamera 2 zum zugrunde liegenden Kameratreiber und zur zugehörigen Hardware hinzu. Das Kamerasubsystem enthält Implementierungen für Kamera-Pipeline-Komponenten, während die Kamera-HAL bietet Schnittstellen zur Implementierung Ihrer Version dieser Komponenten.

Architektur

In der folgenden Abbildung und Liste werden die HAL-Komponenten beschrieben.

Android-Kameraarchitektur

Abbildung 1: Kameraarchitektur

App-Framework
Auf App-Framework-Ebene befindet sich der App-Code. Er verwendet die <ph type="x-smartling-placeholder"></ph> Camera 2 API für die Interaktion mit der Kamerahardware. Intern kann dieser Code entsprechende Anrufe <ph type="x-smartling-placeholder"></ph> Binder-Schnittstellen verwenden, um auf den nativen Code zuzugreifen, der mit dem Kamera.
Logo: AIDL
Die mit CameraService verknüpfte Binder-Schnittstelle kann gefunden unter <ph type="x-smartling-placeholder"></ph> Frameworks/av/camera/aidl/android/hardware. Der generierte Code ruft den untergeordneten Code auf, um Zugriff auf den Kamera und gibt Daten zurück, die zur Erstellung des <ph type="x-smartling-placeholder"></ph> CameraDevice und schließlich <ph type="x-smartling-placeholder"></ph> CameraCaptureSession-Objekte auf Framework-Ebene.
natives Framework
Dieses Framework in frameworks/av/ bietet eine nativen Äquivalent zu den <ph type="x-smartling-placeholder"></ph> CameraDevice und . CameraCaptureSession Klassen. Siehe auch <ph type="x-smartling-placeholder"></ph> NDK camera2.
binder IPC-Schnittstelle
Die IPC-Binder-Schnittstelle erleichtert die Kommunikation über Prozessgrenzen hinweg. In der frameworks/av/camera/camera/aidl/android/hardware-Verzeichnis, das an den Kameradienst. <ph type="x-smartling-placeholder"></ph> ICameraService ist die Schnittstelle zum Kameradienst. <ph type="x-smartling-placeholder"></ph> ICameraDeviceUser ist die Schnittstelle zu einem bestimmten geöffneten Kameragerät; und ICameraServiceListener und ICameraDeviceCallbacks sind die entsprechenden CameraService- und CameraDevice-Callbacks an die App-Framework entwickelt.
Kameradienst
Der Kameradienst mit Sitz in frameworks/av/services/camera/libcameraservice/CameraService.cpp, ist der eigentliche Code, der mit dem HAL interagiert.
HAL
Die Hardwareabstraktionsebene definiert die Standardschnittstelle, Kameradienst ruft an und die Sie implementieren müssen, damit Ihre Kamera dass die Hardware ordnungsgemäß funktioniert.

HAL implementieren

Der HAL befindet sich zwischen dem Kameratreiber und dem übergeordneten Android-Framework. und definiert eine Schnittstelle, die implementiert werden muss, damit Anwendungen ordnungsgemäß funktionieren die Kamera-Hardware. Das HIDL Schnittstellen für den Kamera-HAL sind definiert in <ph type="x-smartling-placeholder"></ph> Hardware/Schnittstellen/Kamera.

Ein typisches binderisiertes HAL muss die folgenden HIDL-Schnittstellen implementieren:

Referenz-HIDL-Implementierungen sind verfügbar für CameraProvider.cpp, <ph type="x-smartling-placeholder"></ph> CameraDevice.cpp und CameraDeviceSession.cpp Die Implementierung umschließt alte HALs, die noch die Legacy API. Ab Android 8.0 muss Kamera-HAL-Implementierungen die HIDL API verwenden. nutzen der alten Benutzeroberfläche nicht unterstützt.

Eingabevalidierung

Da der HAL Zugriff auf andere Ressourcen als der Kameradienst hat, ist die Grenze zwischen werden beide als Sicherheitsgrenze behandelt. Das bedeutet, dass vom Kameradienst übergebene Parameter als nicht vertrauenswürdig und unbereinigt angesehen. Um Sicherheitslücken zu vermeiden, die es Angreifern ermöglichen, Berechtigungen ausweiten oder auf Daten zuzugreifen, auf die sie keinen Zugriff haben, muss der Kamera-HAL Validierung der vom Kameradienst an den HAL übergebenen Parameter. Dazu gehört auch die Prüfung, Längenwerte liegen innerhalb der zulässigen Bereiche und bereinigen die Parameter vor und vor der Verwendung an Hardware- oder Kernel-Treiber übergeben.

Legacy-HAL-Komponenten

In diesem Abschnitt werden die Architektur der Legacy-HAL-Komponenten und implementieren Sie den HAL. Bei Kamera-HAL-Implementierungen unter Android 8.0 und höher muss das oben beschriebene HIDL API.

Architektur (Legacy)

In der folgenden Abbildung und Liste werden die HAL-Komponenten einer alten Kamera beschrieben.

Android-Kameraarchitektur

Abbildung 2: Ältere Kameraarchitektur

App-Framework
Auf App-Framework-Ebene befindet sich der App-Code. Er verwendet die <ph type="x-smartling-placeholder"></ph> android.hardware.Camera API für die Interaktion mit der Kamerahardware Intern ruft dieser Code eine entsprechenden JNI-Glue-Klasse, um auf den nativen Code zuzugreifen, der mit der Kamera.
JNI
Der JNI-Code, der mit <ph type="x-smartling-placeholder"></ph> android.hardware.Camera befindet sich in frameworks/base/core/jni/android_hardware_Camera.cpp Dieser Code den untergeordneten nativen Code aufruft, um Zugriff auf die physische Kamera zu erhalten und gibt Daten zurück, mit denen <ph type="x-smartling-placeholder"></ph> android.hardware.Camera-Objekt auf Framework-Ebene.
natives Framework
Das in frameworks/av/camera/Camera.cpp definierte native Framework ist ein natives Äquivalent zum <ph type="x-smartling-placeholder"></ph> android.hardware.Camera. Diese Klasse ruft die IPC auf. binder-Proxys, um Zugriff auf den Kameradienst zu erhalten.
Binder-IPC-Proxys
Die IPC-Binder-Proxys erleichtern die Kommunikation über Prozessgrenzen hinweg. Es gibt drei Klassen von Kamerabindern, die sich in der Verzeichnis frameworks/av/camera, das den Kameradienst aufruft. ICameraService ist die Schnittstelle zum Kameradienst. ICamera ist die Schnittstelle zu einer bestimmten geöffneten Kamera. ICameraClient ist die Schnittstelle des Geräts App-Framework entwickelt.
Kameradienst
Der Kameradienst mit Sitz in frameworks/av/services/camera/libcameraservice/CameraService.cpp, ist der eigentliche Code, der mit dem HAL interagiert.
HAL
Die Hardwareabstraktionsebene definiert die Standardschnittstelle, Kameradienst ruft an und die Sie implementieren müssen, damit Ihre Kamera dass die Hardware ordnungsgemäß funktioniert.
Kernel-Treiber
Der Kameratreiber interagiert mit der Hardware der Kamera und dem Implementierung von HAL. Kamera und Treiber müssen YV12 und NV21 unterstützen , um die Vorschau des Kamerabilds auf dem Display- und Videoaufzeichnung.

HAL implementieren (alt)

Der HAL befindet sich zwischen dem Kameratreiber und dem übergeordneten Android-Framework. und definiert eine Schnittstelle, die implementiert werden muss, damit Anwendungen ordnungsgemäß funktionieren die Kamera-Hardware. Die HAL-Schnittstelle wird in der hardware/libhardware/include/hardware/camera.h und hardware/libhardware/include/hardware/camera_common.h-Headerdateien.

camera_common.h definiert camera_module, einen Standard Struktur verwenden, um allgemeine Informationen zur Kamera zu erhalten, z. B. die Kamera-ID und Eigenschaften, die allen Kameras gemeinsam sind (d. h. ob es sich um eine Front- oder Kamera auf der Rückseite).

camera.h enthält Code, der zu <ph type="x-smartling-placeholder"></ph> android.hardware.Camera Diese Headerdatei deklariert ein camera_device-Struktur, die wiederum ein camera_device_ops-Struktur mit Verweisen auf Funktionen, die der HAL-Schnittstelle. Weitere Informationen zu den Kameraparametern festgelegt ist, siehe 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 verweist.

Ein Beispiel für eine HAL-Implementierung finden Sie in der Implementierung des Galaxy Nexus HAL in hardware/ti/omap4xxx/camera.

Gemeinsam genutzte Bibliothek konfigurieren

Android-Build-System so einrichten, dass es die HAL-Implementierung richtig verpackt in einer gemeinsam genutzten Bibliothek speichern und an den gewünschten Speicherort kopieren, indem Sie ein Android.mk-Datei:

  1. device/<company_name>/<device_name>/camera erstellen das die Quelldateien Ihrer Bibliothek enthalten soll.
  2. Erstellen Sie die Datei Android.mk, um die gemeinsam genutzte Bibliothek zu erstellen. Sicherstellen, dass das Makefile die folgenden Zeilen enthält:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Der Name Ihrer Bibliothek muss camera.<device_name> lauten (.so wird automatisch angehängt), damit Android die Bibliothek. Ein Beispiel finden Sie im Makefile für die Galaxy Nexus-Kamera im hardware/ti/omap4xxx/Android.mk

  3. Gib an, dass dein Gerät über Kamerafunktionen verfügt, indem du die erforderliche Funktions-XML kopierst im Verzeichnis frameworks/native/data/etc mit Ihrem im Makefile des Geräts. Wenn Sie beispielsweise angeben möchten, dass Ihr Gerät über den Kamerablitz und automatisch fokussieren können, fügen Sie in der <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 \
    

    Ein Beispiel für ein Geräte-Makefile findest du unter device/samsung/tuna/device.mk

  4. Deklariere den Medien-Codec, das Format und die Auflösungsfunktionen deiner Kamera in device/<company_name>/<device_name>/media_profiles.xml und device/<company_name>/<device_name>/media_codecs.xml XML-Dateien. Weitere Informationen finden Sie unter Codecs für die Framework.
  5. Fügen Sie in der Datei Makefile „device/<company_name>/<device_name>/device.mk“ zum Kopieren von media_profiles.xml und media_codecs.xml Dateien an den entsprechenden Speicherort:
    # 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
    
  6. Wenn Sie die Kamera App in das Systembild Ihres Geräts aufnehmen möchten, geben Sie sie in der PRODUCT_PACKAGES-Variable in der device/<company>/<device>/device.mk Makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...