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.
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 gliCameraDevicee infineCameraCaptureSessiona livello di framework. - framework nativo
- Questo framework che risiede in
frameworks/av/fornisce un equivalente nativo delleCameraDeviceeCameraCaptureSessionclassi. 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/hardwaresono 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; eICameraServiceListenereICameraDeviceCallbackssono i callback rispettivi diCameraServiceeCameraDeviceal 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:
-
ICameraProvider: per enumerare i singoli dispositivi e gestirne lo stato. -
ICameraDevice: l'interfaccia del dispositivo della fotocamera. -
ICameraDeviceSession: l'interfaccia della sessione del dispositivo della fotocamera attiva.
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.
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.CameraAPI 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.Camerasi trova inframeworks/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.Cameraoggetto a livello di framework. - framework nativo
- Il framework nativo definito in
frameworks/av/camera/Camera.cppfornisce un equivalente nativo dellaandroid.hardware.Cameraclasse. 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/camerasono 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, eICameraClientè 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:
- Crea una
device/<company_name>/<device_name>/cameradirectory per contenere i file di origine della libreria. - Crea un file
Android.mkper 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.soviene 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 inhardware/ti/omap4xxx/Android.mk. - Specifica che il dispositivo ha funzionalità della fotocamera copiando i file XML delle funzionalità necessari nella directory
frameworks/native/data/etccon 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.mkmakefile 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. - Dichiara le funzionalità di codec, formato e risoluzione multimediali della fotocamera in
device/<company_name>/<device_name>/media_profiles.xmledevice/<company_name>/<device_name>/media_codecs.xmlfile XML. Per maggiori dettagli, consulta Esponi i codec al framework. - Aggiungi le seguenti righe nel makefile
device/<company_name>/<device_name>/device.mkdel dispositivo per copiare i filemedia_profiles.xmlemedia_codecs.xmlnella 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 - Per includere l'app Fotocamera nell'immagine di sistema del dispositivo, specificala nella
PRODUCT_PACKAGESvariabile neldevice/<company>/<device>/device.mkmakefile del dispositivo:PRODUCT_PACKAGES := \ Gallery2 \ ...