Google setzt sich dafür ein, die Rassengerechtigkeit für schwarze Gemeinschaften zu fördern. Siehe wie.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Kamera

Android-Kamera HAL-Symbol

Die Kamera-Hardware-Abstraktionsschicht (HAL) von Android verbindet die übergeordneten Kamera-Framework-APIs in Kamera 2 mit dem zugrunde liegenden Kameratreiber und der zugrunde liegenden Hardware. Das Kamera-Subsystem enthält Implementierungen für Kamera-Pipeline-Komponenten, während die Kamera-HAL Schnittstellen zur Implementierung Ihrer Version dieser Komponenten bereitstellt.

Die Architektur

Die folgende Abbildung und Liste beschreiben die HAL-Komponenten.

Android-Kamera-Architektur

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 die entsprechenden Binder- Schnittstellen auf, um auf den nativen Code zuzugreifen, der mit der Kamera interagiert.
AIDL
Die mit CameraService Binder-Oberfläche 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 der CameraDevice und schließlich CameraCaptureSession Objekte auf Framework-Ebene verwendet werden.
natives Framework
Dieses Framework in den frameworks/av/ bietet ein natives Äquivalent zu den Klassen CameraDevice und CameraCaptureSession . Siehe auch NDK camera2 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 Klassen für frameworks/av/camera/camera/aidl/android/hardware aufrufen. ICameraService ist die Schnittstelle zum ICameraService . ICameraDeviceUser ist die Schnittstelle zu einem bestimmten geöffneten Kameragerät. und ICameraServiceListener und ICameraDeviceCallbacks sind die jeweiligen CameraService und CameraDevice Rückrufe für das Anwendungsframework.
Kamera-Service
Der frameworks/av/services/camera/libcameraservice/CameraService.cpp in den frameworks/av/services/camera/libcameraservice/CameraService.cpp 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 der HAL

Die HAL befindet sich zwischen dem Kameratreiber und dem übergeordneten Android-Framework und definiert eine Schnittstelle, die Sie implementieren müssen, damit Apps die Kamerahardware ordnungsgemäß bedienen können. Die HIDL- Schnittstellen für die Kamera-HAL sind in Hardware / Schnittstellen / Kamera definiert .

Eine typische binderisierte HAL muss die folgenden HIDL-Schnittstellen implementieren:

Referenz-HIDL-Implementierungen sind für CameraProvider.cpp , CameraDevice.cpp und CameraDeviceSession.cpp . Die Implementierung umfasst alte HALs, die weiterhin 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.

Legacy-HAL-Komponenten

In diesem Abschnitt wird die Architektur der älteren 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 (Vermächtnis)

Die folgende Abbildung und Liste beschreiben die älteren HAL-Komponenten der Kamera.

Android-Kamera-Architektur

Abbildung 2. Legacy-Kameraarchitektur

App-Framework
Auf der Ebene des App-Frameworks befindet sich der Code der App, der die android.hardware.Camera API verwendet, um mit der Kamerahardware zu interagieren. Intern ruft dieser Code eine entsprechende JNI-Kleberklasse auf, um auf den nativen Code zuzugreifen, der mit der Kamera interagiert.
JNI
Der mit android.hardware.Camera JNI-Code befindet sich in frameworks/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 des android.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 android.hardware.Camera Klasse. 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 Kameraordnerklassen, die sich im Verzeichnis frameworks/av/camera befinden, das den frameworks/av/camera aufruft. ICameraService ist die Schnittstelle zum ICamera , ICamera ist die Schnittstelle zu einem bestimmten geöffneten Kameragerät und ICameraClient ist die Schnittstelle des Geräts zurück zum App-Framework.
Kamera-Service
Der frameworks/av/services/camera/libcameraservice/CameraService.cpp in den frameworks/av/services/camera/libcameraservice/CameraService.cpp 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 eigentlichen 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 unterstützen.

Implementierung der HAL (Legacy)

Die HAL befindet sich zwischen dem Kameratreiber und dem übergeordneten Android-Framework und definiert eine Schnittstelle, die Sie implementieren müssen, damit Apps die Kamerahardware ordnungsgemäß bedienen können. Die HAL-Schnittstelle ist in den Header-Dateien hardware/libhardware/include/hardware/camera.h und hardware/libhardware/include/hardware/camera_common.h .

camera_common.h definiert camera_module , eine Standardstruktur zum camera_module allgemeiner Informationen über die Kamera, z. B. der Kamera-ID und der Eigenschaften, die allen Kameras gemeinsam sind ( camera_module ob es sich um eine nach vorne oder nach hinten gerichtete Kamera handelt).

camera.h enthält Code, der android.hardware.Camera . 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 gesetzt, auf die int (*set_parameters)(struct camera_device *, const char *parms) in der 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 so ein, dass die HAL-Implementierung korrekt in eine gemeinsam genutzte Bibliothek Android.mk und kopieren Sie sie an den entsprechenden Speicherort, indem Sie eine Android.mk Datei erstellen:

  1. Erstellen Sie ein device/<company_name>/<device_name>/camera , das die Quelldateien Ihrer Bibliothek enthält.
  2. 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 den Namen camera.<device_name> ( .so wird automatisch angehängt), damit Android die Bibliothek korrekt laden kann. Ein Beispiel finden Sie im Makefile für die Galaxy Nexus-Kamera unter hardware/ti/omap4xxx/Android.mk .

  3. 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. Wenn Sie beispielsweise angeben <device>/<company_name>/<device_name>/device.mk , dass Ihr Gerät über einen Kamerablitz verfügt und <device>/<company_name>/<device_name>/device.mk kann, fügen Sie die folgenden Zeilen in das 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 .

  4. Deklarieren Sie die Mediencodec-, Format- und Auflösungsfunktionen Ihrer Kamera in den XML-Dateien device/<company_name>/<device_name>/media_profiles.xml und device/<company_name>/<device_name>/media_codecs.xml . Weitere Informationen finden Sie unter Bereitstellen von Codecs für das Framework .
  5. Fügen Sie die folgenden Zeilen in das Makefile device/<company_name>/<device_name>/device.mk media_profiles.xml media_codecs.xml , um die Dateien media_profiles.xml und media_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
    
  6. Um die Kamera-App in das Systemabbild Ihres Geräts aufzunehmen, geben Sie sie in der Variablen device/<company>/<device>/device.mk Makefile device/<company>/<device>/device.mk PRODUCT_PACKAGES Ihres Geräts an:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...