
Il livello di astrazione dell'hardware della fotocamera (HAL) 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 telecamera include implementazioni per i componenti della pipeline della telecamera mentre l'HAL della telecamera fornisce interfacce da utilizzare nell'implementazione della versione di questi componenti.
Architettura
La figura e l'elenco seguenti descrivono i componenti HAL.

Figura 1. Architettura della fotocamera
- quadro dell'app
- A livello di framework dell'app c'è il codice dell'app, che usa 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 del raccoglitore associata a
CameraService
può essere trovata 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 oggettiCameraDevice
ed eventualmenteCameraCaptureSession
a livello di framework. - quadro nativo
- Questo framework che risiede in
frameworks/av/
fornisce un equivalente nativo alle classiCameraDevice
eCameraCaptureSession
. Vedere anche il riferimento NDK camera2 . - interfaccia IPC del raccoglitore
- L'interfaccia del raccoglitore IPC facilita la comunicazione oltre i confini del processo. Esistono diverse classi di raccoglitore della fotocamera che si trovano nella directory
frameworks/av/camera/camera/aidl/android/hardware
che richiamano il servizio della fotocamera.ICameraService
è l'interfaccia al servizio della fotocamera;ICameraDeviceUser
è l'interfaccia per un dispositivo con fotocamera aperto specifico; eICameraServiceListener
eICameraDeviceCallbacks
sono i rispettivi callbackCameraService
eCameraDevice
al framework dell'applicazione. - servizio di 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
- Il livello di astrazione hardware definisce l'interfaccia standard a cui il servizio telecamera chiama e che è necessario implementare affinché l'hardware della telecamera funzioni correttamente.
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 in modo che le app possano utilizzare correttamente l'hardware della fotocamera. Le interfacce HIDL per Camera HAL sono definite in hardware/interfaces/camera .
Un tipico HAL legato 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.
Le implementazioni HIDL di riferimento sono disponibili per CameraProvider.cpp
, CameraDevice.cpp
e CameraDeviceSession.cpp
. L'implementazione esegue il wrapping dei 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'ingresso
Poiché l'HAL ha accesso a risorse diverse rispetto al servizio telecamera, il confine tra i due viene considerato un confine di sicurezza. Ciò significa che i parametri passati dal servizio della fotocamera sono considerati non attendibili e non disinfettati. Per prevenire le vulnerabilità della sicurezza che consentono agli aggressori di aumentare i privilegi o di accedere a dati a cui non sono destinati ad avere accesso, l'HAL della telecamera deve convalidare i parametri passati dal servizio della telecamera all'HAL. Ciò include il controllo che i valori della lunghezza del buffer rientrino negli intervalli consentiti e la sanificazione dei parametri prima dell'uso e prima di passarli 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 utilizzare invece l'API HIDL, descritta sopra.
Architettura (eredità)
La figura e l'elenco seguenti descrivono i componenti HAL della fotocamera precedente.

Figura 2. Architettura della fotocamera legacy
- quadro dell'app
- A livello di 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 classe di colla JNI corrispondente per accedere al codice nativo che interagisce con la fotocamera. - JNI
- Il codice JNI associato ad
android.hardware.Camera
si 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'oggettoandroid.hardware.Camera
a livello di framework. - quadro nativo
- Il framework nativo definito in
frameworks/av/camera/Camera.cpp
fornisce un equivalente nativo alla classeandroid.hardware.Camera
. Questa classe chiama i proxy del raccoglitore IPC per ottenere l'accesso al servizio della fotocamera. - proxy IPC del raccoglitore
- I proxy del raccoglitore IPC facilitano la comunicazione oltre i confini del processo. Esistono tre classi di raccoglitore della fotocamera che si trovano nella directory
frameworks/av/camera
che chiama il servizio della fotocamera.ICameraService
è l'interfaccia per il servizio fotocamera,ICamera
è l'interfaccia per un dispositivo con fotocamera aperto specifico eICameraClient
è l'interfaccia del dispositivo per tornare al framework dell'app. - servizio di 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
- Il livello di astrazione hardware definisce l'interfaccia standard a cui il servizio telecamera chiama e che è necessario implementare affinché l'hardware della telecamera funzioni correttamente.
- driver del kernel
- Il driver della fotocamera interagisce con l'hardware effettivo della fotocamera e con l'implementazione dell'HAL. La telecamera e il driver devono supportare i formati immagine YV12 e NV21 per fornire supporto per l'anteprima dell'immagine della telecamera 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 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 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 indicata da int (*set_parameters)(struct camera_device *, const char *parms)
.
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 impacchettare correttamente l'implementazione HAL in una libreria condivisa e copiarla nella posizione appropriata creando un file Android.mk
:
- Crea una
device/<company_name>/<device_name>/camera
per contenere i file di origine della tua libreria. - 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, vedere il makefile per la fotocamera del Galaxy Nexus che si trova inhardware/ti/omap4xxx/Android.mk
. - Specifica che il tuo dispositivo ha 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 della fotocamera e può eseguire la messa a fuoco automatica, aggiungi le seguenti righe nel<device>/<company_name>/<device_name>/device.mk
makefile del tuo 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, vedere
device/samsung/tuna/device.mk
. - Dichiara il codec multimediale, il formato e le capacità di risoluzione della fotocamera nei file XML
device/<company_name>/<device_name>/media_profiles.xml
edevice/<company_name>/<device_name>/media_codecs.xml
. Per i dettagli, vedere Esposizione dei codec al framework . - Aggiungi le seguenti righe nel makefile
device/<company_name>/<device_name>/device.mk
del tuo dispositivo per copiare i filemedia_profiles.xml
emedia_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
- Per includere l'app Fotocamera nell'immagine di sistema del tuo dispositivo, specificala nella variabile
PRODUCT_PACKAGES
nel dispositivo del tuodevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...