
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.

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 oggettiCameraDevice
e infineCameraCaptureSession
a livello di framework. - framework nativo
- Questo framework che si trova in
frameworks/av/
fornisce un equivalente nativo alle classiCameraDevice
eCameraCaptureSession
. 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
eICameraDeviceCallbacks
sono i callbackCameraService
eCameraDevice
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:
-
ICameraProvider
: Per enumerare i singoli dispositivi e gestirne lo stato. -
ICameraDevice
: L'interfaccia del dispositivo videocamera. -
ICameraDeviceSession
: L'interfaccia della sessione del dispositivo videocamera attivo.
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.

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 inframeworks/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'oggettoandroid.hardware.Camera
a livello di framework. - framework nativo
- Il framework nativo definito in
frameworks/av/camera/Camera.cpp
fornisce un equivalente nativo della classeandroid.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, eICameraClient
è 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
:
- Crea una directory
device/<company_name>/<device_name>/camera
per contenere i file di origine della libreria. - 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 inhardware/ti/omap4xxx/Android.mk
. - 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
. - Dichiara le funzionalità di codec, formato e risoluzione dei contenuti multimediali della videocamera nei file XML
device/<company_name>/<device_name>/media_profiles.xml
edevice/<company_name>/<device_name>/media_codecs.xml
. Per maggiori dettagli, vedi Esposizione dei codec al framework. - Aggiungi le seguenti righe nel makefile
device/<company_name>/<device_name>/device.mk
del 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 dispositivo, specificala nella variabile
PRODUCT_PACKAGES
nel filedevice/<company>/<device>/device.mk
makefile del dispositivo:PRODUCT_PACKAGES := \ Gallery2 \ ...