Fotocamera

Icona HAL della fotocamera Android

L'hardware abstraction layer (HAL) della fotocamera di Android collega le API del framework della fotocamera di livello superiore in Camera 2 al driver e all'hardware della fotocamera sottostanti. Il sottosistema della fotocamera include implementazioni per i componenti della pipeline della fotocamera, mentre l'HAL della fotocamera fornisce interfacce da utilizzare per implementare la tua versione di questi componenti.

Architettura

La figura e l'elenco seguenti descrivono i componenti 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 l' API Camera 2 per interagire con l'hardware della fotocamera. Internamente, questo codice chiama le interfacce Binder corrispondenti per accedere al codice nativo che interagisce con la fotocamera.
AIDL
L'interfaccia binder associata a CameraService è disponibile in frameworks/av/camera/aidl/android/hardware. Il codice generato chiama il codice nativo di livello inferiore per ottenere l'accesso alla fotocamera fisica e restituisce i dati utilizzati per creare gli CameraDevice e infine CameraCaptureSession a livello di framework.
framework nativo
Questo framework che risiede in frameworks/av/ fornisce un equivalente nativo delle CameraDevice e CameraCaptureSession classi. Consulta anche Riferimento NDK camera2.
interfaccia IPC binder
L'interfaccia binder IPC facilita la comunicazione tra i limiti dei processi. Nella directory frameworks/av/camera/camera/aidl/android/hardware sono presenti diverse classi binder della fotocamera che chiamano il servizio della fotocamera. ICameraService è l'interfaccia del servizio della fotocamera; ICameraDeviceUser è l'interfaccia di un dispositivo della fotocamera aperto specifico; e ICameraServiceListener e ICameraDeviceCallbacks sono i callback rispettivi di CameraService e CameraDevice al framework dell'app.
servizio della fotocamera
Il servizio della fotocamera, che si trova in frameworks/av/services/camera/libcameraservice/CameraService.cpp, è il codice effettivo che interagisce con l'HAL.
HAL
L'hardware abstraction layer definisce l'interfaccia standard che il servizio della fotocamera chiama e che devi implementare per far funzionare correttamente l'hardware della fotocamera.

Implementare l'HAL

L'HAL si trova tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che devi implementare in modo che le app possano utilizzare correttamente l'hardware della fotocamera. Le interfacce HIDL per l'HAL della fotocamera sono definite in hardware/interfaces/camera.

Un HAL binderizzato tipico deve implementare le seguenti interfacce HIDL:

Sono disponibili implementazioni HIDL di riferimento per CameraProvider.cpp, CameraDevice.cpp, e CameraDeviceSession.cpp. L'implementazione esegue il wrapping degli HAL precedenti che utilizzano ancora l' API legacy. A partire da Android 8.0, le implementazioni dell'HAL della fotocamera devono utilizzare l'API HIDL; l'utilizzo dell'interfaccia legacy non è supportato.

Convalida dell'input

Poiché l'HAL ha accesso a risorse diverse rispetto al servizio della fotocamera, il limite tra i due viene trattato come un limite di sicurezza. Ciò significa che i parametri passati dal servizio della fotocamera sono considerati non attendibili e non sanificati. Per evitare vulnerabilità di sicurezza che consentano agli autori di attacchi di aumentare i privilegi o accedere a dati a cui non dovrebbero avere accesso, l'HAL della fotocamera deve convalidare i parametri passati dal servizio della fotocamera all'HAL. Ciò include la verifica che i valori della lunghezza del buffer rientrino negli intervalli consentiti e la sanificazione dei parametri prima dell'uso e prima di passarli ai driver hardware o kernel.

Componenti HAL legacy

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

Architettura (legacy)

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

Architettura della fotocamera Android

Figura 2. Architettura della fotocamera legacy

framework dell'app
A livello di framework dell'app si trova il codice dell'app, che utilizza l' android.hardware.Camera API per interagire con l'hardware della fotocamera. Internamente, questo codice chiama una classe glue JNI corrispondente per accedere al codice nativo che interagisce con la 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 l' android.hardware.Camera oggetto a livello di framework.
framework nativo
Il framework nativo definito in frameworks/av/camera/Camera.cpp fornisce un equivalente nativo della android.hardware.Camera classe. Questa classe chiama i proxy binder IPC per ottenere l'accesso al servizio della fotocamera.
proxy binder IPC
I proxy binder IPC facilitano la comunicazione tra i limiti dei processi. Nella directory frameworks/av/camera sono presenti tre classi binder della fotocamera che chiamano il servizio della fotocamera. ICameraService è l'interfaccia del servizio della fotocamera, ICamera è l'interfaccia di un dispositivo della fotocamera aperto specifico, e ICameraClient è l'interfaccia del dispositivo per il framework dell'app.
servizio della fotocamera
Il servizio della fotocamera, che si trova in frameworks/av/services/camera/libcameraservice/CameraService.cpp, è il codice effettivo che interagisce con l'HAL.
HAL
L'hardware abstraction layer definisce l'interfaccia standard che il servizio della fotocamera chiama e che devi implementare per far funzionare correttamente l'hardware della fotocamera.
driver del kernel
Il driver della fotocamera interagisce con l'hardware della fotocamera effettivo e con la tua implementazione dell'HAL. La fotocamera e il driver devono supportare i formati di immagine YV12 e NV21 per fornire il supporto per l'anteprima dell'immagine della fotocamera sul display e la registrazione video.

Implementare l'HAL (legacy)

L'HAL si trova tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che devi implementare in modo che le app possano utilizzare correttamente l'hardware della fotocamera. L'interfaccia HAL è definita nei file di intestazione hardware/libhardware/include/hardware/camera.h e hardware/libhardware/include/hardware/camera_common.h.

camera_common.h definisce camera_module, una struttura standard per ottenere informazioni generali sulla fotocamera, come l'ID della fotocamera e le proprietà comuni a tutte le fotocamere (ovvero se si tratta di una fotocamera anteriore o posteriore).

camera.h contiene il codice corrispondente a android.hardware.Camera. Questo file di intestazione dichiara una camera_device struct che a sua volta contiene una camera_device_ops struct con puntatori alle funzioni che implementano l'interfaccia HAL. Per la documentazione sui parametri della fotocamera che gli sviluppatori possono impostare, consulta frameworks/av/include/camera/CameraParameters.h. Questi parametri vengono impostati con la funzione a cui punta int (*set_parameters)(struct camera_device *, const char *parms) nell'HAL.

Per un esempio di implementazione HAL, consulta l'implementazione per l'HAL Galaxy Nexus in hardware/ti/omap4xxx/camera.

Configurare la libreria condivisa

Configura il sistema di compilazione di Android in modo che l'implementazione HAL venga pacchettizzata correttamente in una libreria condivisa e copiata nella posizione appropriata creando un file Android.mk:

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

    La libreria deve essere denominata camera.<device_name> (l'estensione .so viene aggiunta automaticamente), in modo che Android possa caricare correttamente la libreria. Per un esempio, consulta il makefile per la fotocamera Galaxy Nexus che si trova in hardware/ti/omap4xxx/Android.mk.

  3. Specifica che il dispositivo ha funzionalità della fotocamera copiando i file XML delle funzionalità necessari nella directory frameworks/native/data/etc con il makefile del dispositivo. Ad esempio, per specificare che il dispositivo ha un flash della fotocamera e può mettere a fuoco automaticamente, aggiungi le seguenti righe nel <device>/<company_name>/<device_name>/device.mk makefile del dispositivo:
    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 del dispositivo, consulta device/samsung/tuna/device.mk.

  4. Dichiara le funzionalità di codec, formato e risoluzione multimediali della fotocamera in device/<company_name>/<device_name>/media_profiles.xml e device/<company_name>/<device_name>/media_codecs.xml file XML. Per maggiori dettagli, consulta Esponi i codec al framework.
  5. Aggiungi le seguenti righe nel makefile device/<company_name>/<device_name>/device.mkdel dispositivo per copiare i file media_profiles.xml e media_codecs.xml 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 variabile nel device/<company>/<device>/device.mk makefile del dispositivo:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...