Fotocamera

Icona HAL della fotocamera Android

L'hardware abstraction layer (HAL) della videocamera di Android collega le API del 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 videocamera

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 videocamera.
AIDL
L'interfaccia del binder associata a CameraService si trova 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 oggetti CameraDevice e infine CameraCaptureSession a livello di framework.
framework nativo
Questo framework che si trova in frameworks/av/ fornisce un equivalente nativo alle classi CameraDevice e CameraCaptureSession. Vedi anche Riferimento NDK camera2.
interfaccia IPC binder
L'interfaccia del binder IPC facilita la comunicazione oltre i limiti del processo. Nella directory frameworks/av/camera/camera/aidl/android/hardware si trovano diverse classi di binder della videocamera che chiamano il servizio della videocamera. ICameraService è l'interfaccia del servizio di videocamera; ICameraDeviceUser è l'interfaccia di una videocamera specifica aperta; ICameraServiceListener e ICameraDeviceCallbacks sono i callback CameraService e CameraDevice rispettivi al framework dell'app.
servizio di riparazione della videocamera
Il servizio della videocamera, 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 videocamera chiama e che devi implementare per far funzionare correttamente l'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 in modo che le app possano utilizzare correttamente l'hardware della videocamera. Le interfacce HIDL per l'HAL della fotocamera sono definite in hardware/interfaces/camera.

Un HAL binderizzato tipico deve implementare le seguenti interfacce HIDL:

Le implementazioni HIDL di riferimento sono disponibili per CameraProvider.cpp, CameraDevice.cpp, e CameraDeviceSession.cpp. L'implementazione esegue il wrapping di HAL precedenti che utilizzano ancora l'API legacy. A partire da Android 8.0, le implementazioni 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 videocamera, il confine tra i due viene trattato come un confine di sicurezza. Ciò significa che i parametri passati dal servizio della videocamera sono considerati non attendibili e non sanificati. Per evitare vulnerabilità di sicurezza che consentono agli autori degli attacchi di aumentare i privilegi o accedere a dati a cui non dovrebbero avere accesso, l'HAL della videocamera deve convalidare i parametri trasmessi dal servizio della videocamera 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 del kernel.

Componenti HAL legacy

Questa sezione descrive l'architettura dei componenti HAL legacy e come implementare l'HAL. Le implementazioni 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 videocamera legacy.

Architettura della fotocamera Android

Figura 2. Architettura della videocamera precedente

framework dell'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. Internamente, questo codice chiama una classe JNI glue 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 videocamera 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 fotocamera.
proxy IPC del raccoglitore
I proxy binder IPC facilitano la comunicazione oltre i limiti dei processi. Esistono tre classi di binder della videocamera che si trovano nella directory frameworks/av/camera che chiama il servizio della videocamera. ICameraService è l'interfaccia del servizio della videocamera, ICamera è l'interfaccia di una videocamera specifica aperta, e ICameraClient è l'interfaccia del dispositivo per il framework dell'app.
servizio di riparazione della videocamera
Il servizio della videocamera, 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 videocamera chiama e che devi implementare per far funzionare correttamente l'hardware della videocamera.
driver del kernel
Il driver della videocamera interagisce con l'hardware della videocamera e con l'implementazione dell'HAL. La videocamera e il conducente devono supportare i formati 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 in modo che le app possano utilizzare 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, come l'ID videocamera e le proprietà comuni a tutte le videocamere (ovvero se è una videocamera anteriore o posteriore).

camera.h contiene 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 a 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 indicata da int (*set_parameters)(struct camera_device *, const char *parms) nell'HAL.

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

Configurare la raccolta condivisa

Configura il sistema di compilazione Android per creare correttamente il pacchetto dell'implementazione HAL in una libreria condivisa e copiarlo 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 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> (.so viene aggiunto automaticamente), in modo che Android possa caricare correttamente la libreria. Per un esempio, consulta il makefile della videocamera Galaxy Nexus che si trova in hardware/ti/omap4xxx/Android.mk.

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

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