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.
- 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; undICameraServiceListener
undICameraDeviceCallbacks
sind die entsprechendenCameraService
- undCameraDevice
-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:
- <ph type="x-smartling-placeholder"></ph>
ICameraProvider
: Zum Auflisten einzelner Geräte und zur Verwaltung ihres Status. - <ph type="x-smartling-placeholder"></ph>
ICameraDevice
: Die Oberfläche des Kamerageräts. - <ph type="x-smartling-placeholder"></ph>
ICameraDeviceSession
: Die aktive Oberfläche der Kameragerätesitzung.
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.
- 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 inframeworks/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:
device/<company_name>/<device_name>/camera
erstellen das die Quelldateien Ihrer Bibliothek enthalten soll.- 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 imhardware/ti/omap4xxx/Android.mk
- 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
- Deklariere den Medien-Codec, das Format und die Auflösungsfunktionen deiner Kamera in
device/<company_name>/<device_name>/media_profiles.xml
unddevice/<company_name>/<device_name>/media_codecs.xml
XML-Dateien. Weitere Informationen finden Sie unter Codecs für die Framework. - Fügen Sie in der Datei
Makefile „
device/<company_name>/<device_name>/device.mk
“ zum Kopieren vonmedia_profiles.xml
undmedia_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
- Wenn Sie die Kamera App in das Systembild Ihres Geräts aufnehmen möchten, geben Sie sie in der
PRODUCT_PACKAGES
-Variable in derdevice/<company>/<device>/device.mk
Makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...