Fotocamera

Icona HAL della fotocamera Android

L'HAL (Camera Hardware Astrazione Layer) di Android connette le reti di le API del framework della videocamera Videocamera 2 al driver e all'hardware della videocamera di base. Il sottosistema delle fotocamere include implementazioni per i componenti della pipeline della videocamera mentre l'HAL della videocamera fornisce interfacce da usare per implementare la tua versione di questi componenti.

Architettura

La figura e l'elenco seguenti descrivono i componenti dell'HAL.

Architettura della fotocamera Android

Figura 1. Architettura della fotocamera

framework dell'app
A livello di framework dell'app si trova il codice dell'app, che utilizza API Camera 2 per interagire con l'hardware della videocamera. Internamente, questo codice chiamate corrispondenti Binder per accedere al codice nativo che interagisce con fotocamera.
AIDL
L'interfaccia di binder associata a CameraService può essere disponibile in . frameworks/av/camera/aidl/android/hardware. Il codice generato chiama il codice nativo di livello inferiore per ottenere l'accesso fotocamera fisica e restituisce i dati utilizzati per creare CameraDevice e alla fine CameraCaptureSession a livello di framework.
framework nativo
Questo framework presente in frameworks/av/ fornisce una nativo equivalente . CameraDevice e CameraCaptureSession . Vedi anche Riferimento videocamera NDK 2.
interfaccia IPC binder
L'interfaccia di binder IPC facilita la comunicazione oltre i confini dei processi. Nella frameworks/av/camera/camera/aidl/android/hardware directory che chiamata al servizio videocamera. ICameraService è l'interfaccia per il servizio videocamera; ICameraDeviceUser è l'interfaccia per uno specifico videocamera; e ICameraServiceListener e ICameraDeviceCallbacks sono i rispettivi CameraService e CameraDevice richiamano al un framework per app.
servizio videocamera
Il servizio di fotocamere, situato in frameworks/av/services/camera/libcameraservice/CameraService.cpp, è il codice che interagisce con l'HAL.
HAL
Il livello di astrazione hardware definisce l'interfaccia standard che devi implementare per far sì che la videocamera che l'hardware funzioni correttamente.

Implementare l'HAL

L'HAL si trova a metà strada tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che è necessario implementare affinché le app possano funzionare correttamente dall'hardware della videocamera. L'HIDL interfacce per Camera HAL sono definite . hardware/interfacce/videocamera.

Un tipico HAL binderizzato deve implementare le seguenti interfacce HIDL:

Le implementazioni di riferimento HIDL sono disponibili per CameraProvider.cpp, CameraDevice.cpp e CameraDeviceSession.cpp L'implementazione aggrega i vecchi HAL che utilizzano ancora API legacy. A partire da Android 8.0, le implementazioni HAL per Fotocamera devono usare l'API HIDL. utilizzare dell'interfaccia precedente non è supportata.

Convalida degli input

Poiché l'HAL ha accesso a risorse diverse rispetto al servizio videocamera, il confine tra vengono considerati come un confine di sicurezza. Ciò significa che i parametri trasmessi dal servizio di fotocamere considerati non attendibili e non sottoposti a sanitizzazione. Per prevenire vulnerabilità di sicurezza che consentono ai malintenzionati di e aumentare i privilegi o accedere ai dati a cui non devono avere accesso, l'HAL della videocamera deve convalidare i parametri trasmessi dal servizio fotocamera all'HAL. Ciò include la verifica del buffer i valori della lunghezza rientrano negli intervalli consentiti e vengono sottoposti a sanificazione dei parametri prima dell'uso e passarle ai driver hardware o kernel.

Componenti HAL precedenti

Questa sezione descrive l'architettura dei componenti HAL precedenti e come implementare l'HAL. Le implementazioni HAL della fotocamera su Android 8.0 e versioni successive devono utilizzare l'API HIDL, descritta in precedenza.

Architettura (legacy)

La figura e l'elenco seguenti descrivono i componenti HAL della videocamera legacy.

Architettura della fotocamera Android

Figura 2. Architettura precedente delle fotocamere

framework dell'app
A livello di framework dell'app si trova il codice dell'app, che utilizza android.hardware.Camera per interagire con l'hardware della videocamera. Internamente, questo codice chiama una la classe di colla JNI corrispondente per accedere al codice nativo che interagisce fotocamera.
JNI
Il codice JNI associato a android.hardware.Camera si trova in frameworks/base/core/jni/android_hardware_Camera.cpp. Questo codice chiama il codice nativo di livello inferiore per ottenere l'accesso alla fotocamera fisica e restituisce i dati utilizzati per creare android.hardware.Camera a livello di framework.
framework nativo
Il framework nativo definito in frameworks/av/camera/Camera.cpp offre un equivalente nativo . android.hardware.Camera corso. Questa classe chiama l'IPC a proxy di binder per ottenere l'accesso al servizio di fotocamera.
proxy IPC binder
I proxy del legante IPC facilitano la comunicazione oltre i confini dei processi. Esistono tre classi di raccoglitore di fotocamere che si trovano nella Directory di frameworks/av/camera che effettua le chiamate al servizio di videocamera. ICameraService è l'interfaccia del servizio videocamera, ICamera è l'interfaccia di uno specifico dispositivo con fotocamera aperta, e ICameraClient è l'interfaccia del dispositivo un framework per app.
servizio videocamera
Il servizio di fotocamere, situato in frameworks/av/services/camera/libcameraservice/CameraService.cpp, è il codice che interagisce con l'HAL.
HAL
Il livello di astrazione hardware definisce l'interfaccia standard che devi implementare per far sì che la videocamera che l'hardware funzioni correttamente.
driver kernel
Il driver della videocamera interagisce con l'hardware effettivo della videocamera e implementazione dell'HAL. La fotocamera e il driver devono supportare le versioni YV12 e NV21 formati immagine per fornire un supporto per visualizzare l'anteprima dell'immagine della fotocamera sul la registrazione video e display.

Implementare l'HAL (legacy)

L'HAL si trova a metà strada tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che è necessario implementare affinché le app possano funzionare correttamente dall'hardware della videocamera. L'interfaccia dell'HAL è definita nel hardware/libhardware/include/hardware/camera.h e hardware/libhardware/include/hardware/camera_common.h file di intestazione.

camera_common.h definisce camera_module, uno standard per ottenere informazioni generali sulla videocamera, ad esempio l'ID fotocamera e le proprietà comuni a tutte le fotocamere (ad esempio, che si tratti di un fotocamera posteriore).

camera.h contiene un codice che corrisponde a android.hardware.Camera. Questo file di intestazione dichiara struct camera_device che a sua volta contiene un struct camera_device_ops con puntatori a funzioni che implementano l'interfaccia dell'HAL. Per consultare la documentazione sui parametri della videocamera, gli sviluppatori possono è impostata, consulta la sezione frameworks/av/include/camera/CameraParameters.h. Questi parametri sono impostati con la funzione che punta da int (*set_parameters)(struct camera_device *, const char *parms) nell'HAL.

Per un esempio di implementazione dell'HAL, fai riferimento all'implementazione per Galaxy Nexus HAL in hardware/ti/omap4xxx/camera.

Configurare la libreria condivisa

Configurare il sistema di build Android per pacchettizzare correttamente l'implementazione dell'HAL in una libreria condivisa e copiarla nella posizione appropriata creando un File Android.mk:

  1. Crea un device/<company_name>/<device_name>/camera in cui inserire i file di origine della libreria.
  2. Crea un file Android.mk per creare la libreria condivisa. Assicurati che il makefile contenga le righe seguenti:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Il nome della tua raccolta deve essere camera.<device_name> (.so viene aggiunto automaticamente), in modo che Android possa caricare correttamente libreria. Ad esempio, osserva il file di creazione per la fotocamera Galaxy Nexus situato in hardware/ti/omap4xxx/Android.mk.

  3. Specifica che il tuo dispositivo dispone delle funzionalità della fotocamera copiando il file XML delle funzionalità necessario nella directory frameworks/native/data/etc con il tuo il makefile del dispositivo. Ad esempio, per specificare che il dispositivo disponga di un flash della fotocamera e puoi mettere a fuoco automaticamente, aggiungi le seguenti righe nella <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 \
    

    Per un esempio di makefile di un dispositivo, vedi device/samsung/tuna/device.mk.

  4. Dichiara le funzionalità di codec multimediale, formato e risoluzione della videocamera in device/<company_name>/<device_name>/media_profiles.xml e device/<company_name>/<device_name>/media_codecs.xml XML. Per maggiori dettagli, vedi L'esposizione dei codec ai Google Cloud.
  5. Aggiungi le seguenti righe nella Makefile di device/<company_name>/<device_name>/device.mk per copiare media_profiles.xml e media_codecs.xml i file nella posizione appropriata:
    # 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. Per includere l'app Fotocamera nell'immagine di sistema del dispositivo, specificala nella PRODUCT_PACKAGES nella variabile del dispositivo device/<company>/<device>/device.mk Makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...