Fotocamera

Icona HAL della fotocamera Android

Il livello di astrazioni hardware della videocamera (HAL) di Android collega le API di framework della videocamera di livello superiore in Camera 2 al driver e all'hardware della videocamera 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 per 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. All'interno, questo codice chiama le interfacce Binder corrispondenti per accedere al codice nativo che interagisce con la videocamera.
AIDL
L'interfaccia binder associata a CameraService si trova all'indirizzo 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 oggetti CameraDevice ed eventualmente CameraCaptureSession a livello di framework.
framework nativo
Questo framework residente in frameworks/av/ fornisce un equivalente nativo alle classi CameraDevice e CameraCaptureSession. Vedi anche la documentazione di riferimento di NDK camera2.
Interfaccia IPC di Binder
L'interfaccia del binder IPC facilita la comunicazione oltre i confini dei processi. Nella directory frameworks/av/camera/camera/aidl/android/hardware sono presenti diversi binder della videocamera che richiamano il servizio della videocamera. ICameraService è l'interfaccia del servizio della videocamera; ICameraDeviceUser è l'interfaccia di un dispositivo della videocamera aperto specifico; ICameraServiceListener e ICameraDeviceCallbacks sono i rispettivi callback CameraService e CameraDevice per il framework dell'app.
servizio di fotocamere
Il servizio della fotocamera, situato in frameworks/av/services/camera/libcameraservice/CameraService.cpp, è il codice effettivo che interagisce con l'HAL.
HAL
Il livello di astrazione hardware definisce l'interfaccia standard invocata dal servizio della videocamera e che devi implementare per il corretto funzionamento dell'hardware della videocamera.

Implementa l'HAL

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

Un HAL con binder deve implementare le seguenti interfacce HIDL:

Le implementazioni HIDL di riferimento sono disponibili per CameraProvider.cpp, CameraDevice.cpp, e CameraDeviceSession.cpp. L'implementazione racchiude i vecchi HAL che utilizzano ancora la API precedente. A partire da Android 8.0, le implementazioni HAL della fotocamera devono utilizzare l'API HIDL. L'utilizzo dell'interfaccia precedente non è supportato.

Convalida dell'input

Poiché l'HAL ha accesso a risorse diverse rispetto al servizio della videocamera, il confine tra i due viene considerato un confine di sicurezza. Ciò significa che i parametri passati dal servizio della videocamera sono considerati non attendibili e non sottoposti a sanificazione. Per evitare vulnerabilità di sicurezza che consentono agli utenti malintenzionati di elevare i privilegi o accedere a dati a cui non è previsto che abbiano accesso, l'HAL della fotocamera deve convalidare i parametri passati dal servizio della fotocamera all'HAL. Ciò include il controllo che i valori di lunghezza del buffer rientrino negli intervalli consentiti e la sanitizzazione dei parametri prima dell'uso e prima di trasmetterli ai driver hardware o del kernel.

Componenti HAL legacy

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 invece l'API HIDL, descritta sopra.

Architettura (legacy)

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

Architettura della fotocamera Android

Figura 2. Architettura della videocamera precedente

framework per app
A livello di framework dell'app si trova il codice dell'app, che utilizza l'API android.hardware.Camera per interagire con l'hardware della fotocamera. All'interno, questo codice chiama una classe di collegamento JNI corrispondente per accedere al codice nativo che interagisce con la videocamera.
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'oggetto android.hardware.Camera a livello di framework.
framework nativo
Il framework nativo definito in frameworks/av/camera/Camera.cpp fornisce un equivalente nativo della classe android.hardware.Camera. Questa classe chiama i proxy binder IPC per ottenere l'accesso al servizio della fotocamera.
Proxy IPC di Binder
I proxy del binder IPC facilitano la comunicazione oltre i confini dei processi. Esistono tre classi di binder della videocamera nella directory frameworks/av/camera che chiamano il servizio della videocamera. ICameraService è l'interfaccia del servizio della videocamera, ICamera è l'interfaccia di un dispositivo della videocamera aperto specifico e ICameraClient è l'interfaccia del dispositivo con il framework dell'app.
servizio di fotocamere
Il servizio della fotocamera, situato in frameworks/av/services/camera/libcameraservice/CameraService.cpp, è il codice effettivo che interagisce con l'HAL.
HAL
Il livello di astrazione hardware definisce l'interfaccia standard invocata dal servizio della videocamera e che devi implementare per il corretto funzionamento dell'hardware della videocamera.
driver del kernel
Il driver della videocamera interagisce con l'hardware della videocamera effettiva e con l'implementazione dell'HAL. La videocamera e il driver devono supportare i formati di immagine YV12 e NV21 per fornire il supporto per l'anteprima dell'immagine della videocamera sul display e la registrazione video.

Implementare l'HAL (legacy)

L'HAL si trova tra il driver della videocamera e il framework Android di livello superiore e definisce un'interfaccia che devi implementare affinché le app possano operare correttamente l'hardware della videocamera. 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 videocamera, ad esempio l'ID della videocamera e le proprietà comuni a tutte le videocamere (ad esempio 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 struttura camera_device che a sua volta contiene una struttura camera_device_ops con puntatori alle funzioni che implementano l'interfaccia HAL. Per la documentazione sui parametri della videocamera che gli sviluppatori possono impostare, consulta frameworks/av/include/camera/CameraParameters.h. Questi parametri vengono impostati con la funzione a cui fa riferimento int (*set_parameters)(struct camera_device *, const char *parms) nell'HAL.

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

Configurare la libreria condivisa

Configura il sistema di compilazione Android in modo da pacchettizzare correttamente l'implementazione HAL in una libreria condivisa e copiarla nella posizione appropriata creando un file Android.mk:

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

    La raccolta deve avere il nome camera.<device_name> (.so viene aggiunto automaticamente) in modo che Android possa caricarla correttamente. Per un esempio, consulta il file make per la videocamera Galaxy Nexus in hardware/ti/omap4xxx/Android.mk.

  3. Specifica che il tuo dispositivo è dotato di funzionalità della fotocamera copiando i file XML delle funzionalità necessarie nella directory frameworks/native/data/etc con il file make del dispositivo. Ad esempio, per specificare che il tuo dispositivo ha un flash della fotocamera e può usare l'autofocus, aggiungi le seguenti righe nel file make<device>/<company_name>/<device_name>/device.mk 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 file make del dispositivo, consulta device/samsung/tuna/device.mk.

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