Fotocamera

Icona HAL della fotocamera Android

Il livello di astrazione hardware (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 sottostante. Il sottosistema della fotocamera include implementazioni per i componenti della pipeline della fotocamera mentre l'HAL della fotocamera fornisce interfacce da utilizzare nell'implementazione della versione di questi componenti.

Architettura

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

Architettura della fotocamera Android

Figura 1. Architettura della fotocamera

quadro dell'app
A livello del framework dell'app c'è il codice dell'app, che utilizza l'API Camera 2 per interagire con l'hardware della fotocamera. Internamente, questo codice chiama le corrispondenti interfacce Binder per accedere al codice nativo che interagisce con la fotocamera.
AIDL
L'interfaccia del raccoglitore associata a CameraService è disponibile in frameworks/av/camera/aidl/android/hardware . Il codice generato richiama 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.
quadro nativo
Questo framework che risiede in frameworks/av/ fornisce un equivalente nativo delle classi CameraDevice e CameraCaptureSession . Vedi anche riferimento NDK camera2 .
interfaccia IPC legante
L'interfaccia del raccoglitore IPC facilita la comunicazione oltre i confini del processo. Esistono diverse classi di raccoglitori di fotocamere situate nella directory frameworks/av/camera/camera/aidl/android/hardware che richiamano il servizio fotocamera. ICameraService è l'interfaccia del servizio fotocamera; ICameraDeviceUser è l'interfaccia per uno specifico dispositivo fotocamera aperto; e ICameraServiceListener e ICameraDeviceCallbacks sono i rispettivi callback CameraService e CameraDevice al framework dell'applicazione.
servizio fotografico
Il servizio 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 a cui viene chiamato il servizio della fotocamera e che è necessario implementare per far funzionare correttamente l'hardware della fotocamera.

Implementazione dell'HAL

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

Un tipico HAL binderizzato 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 l' API legacy . A partire da Android 8.0, le implementazioni HAL della fotocamera devono utilizzare l'API HIDL; l'uso dell'interfaccia legacy non è supportato.

Convalida dell'input

Poiché l'HAL ha accesso a risorse diverse rispetto al servizio fotocamera, il confine tra i due viene considerato un limite di sicurezza. Ciò significa che i parametri trasmessi dal servizio fotocamera sono considerati non attendibili e non disinfettati. Per prevenire vulnerabilità della sicurezza che consentano agli utenti malintenzionati di aumentare i privilegi o accedere a dati a cui non intendono accedere, l'HAL della fotocamera deve convalidare i parametri passati dal servizio della fotocamera all'HAL. Ciò include il controllo che i valori della lunghezza del buffer rientrino negli intervalli consentiti e la pulizia dei parametri prima dell'uso e prima di trasmetterli all'hardware o ai driver 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 invece utilizzare l'API HIDL, descritta sopra.

Architettura (eredità)

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

Architettura della fotocamera Android

Figura 2. Architettura della fotocamera precedente

quadro dell'app
A livello del framework dell'app c'è il codice dell'app, che utilizza l'API android.hardware.Camera per interagire con l'hardware della fotocamera. Internamente, questo codice chiama una corrispondente classe di colla JNI per accedere al codice nativo che interagisce con la fotocamera.
JNI
Il codice JNI associato ad android.hardware.Camera si trova in frameworks/base/core/jni/android_hardware_Camera.cpp . Questo codice richiama 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.
quadro nativo
Il framework nativo definito in frameworks/av/camera/Camera.cpp fornisce un equivalente nativo alla classe android.hardware.Camera . Questa classe chiama i proxy del raccoglitore IPC per ottenere l'accesso al servizio fotocamera.
proxy IPC legante
I proxy leganti IPC facilitano la comunicazione oltre i confini del processo. Sono presenti tre classi di raccoglitori di fotocamere che si trovano nella directory frameworks/av/camera che richiama il servizio fotocamera. ICameraService è l'interfaccia per il servizio fotocamera, ICamera è l'interfaccia per uno specifico dispositivo fotocamera aperto e ICameraClient è l'interfaccia del dispositivo al framework dell'app.
servizio fotografico
Il servizio 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 a cui viene chiamato il servizio della fotocamera e che è necessario implementare per far funzionare correttamente l'hardware della fotocamera.
driver del kernel
Il driver della fotocamera interagisce con l'hardware effettivo della fotocamera e con l'implementazione dell'HAL. La fotocamera e il driver devono supportare i formati immagine YV12 e NV21 per fornire supporto per l'anteprima dell'immagine della fotocamera sul display e la registrazione video.

Implementazione dell'HAL (legacy)

L'HAL si trova tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che è necessario implementare affinché 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 frontale o posteriore).

camera.h contiene il codice che corrisponde 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 fotocamera che gli sviluppatori possono impostare, fare riferimento a frameworks/av/include/camera/CameraParameters.h . Questi parametri vengono impostati con la funzione puntata da int (*set_parameters)(struct camera_device *, const char *parms) nell'HAL.

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

Configurazione della libreria condivisa

Configura il sistema di build Android per comprimere correttamente l'implementazione HAL in una libreria condivisa e copiala 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 tua libreria.
  2. Crea un file Android.mk per creare la libreria condivisa. Assicurarsi che il makefile contenga le seguenti righe:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    La tua 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 per la fotocamera Galaxy Nexus situato in hardware/ti/omap4xxx/Android.mk .

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

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