![Icona HAL della fotocamera Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=3&hl=it)
Il livello di astrazioni hardware della videocamera (HAL) di Android collega le API di 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](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=3&hl=it)
Figura 1. Architettura della fotocamera
- framework per 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. All'interno, questo codice chiama le interfacce Binder corrispondenti per accedere al codice nativo che interagisce con la videocamera.
- AIDL
- L'interfaccia binder associata a
CameraService
si trova all'indirizzo 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. - framework nativo
- Questo framework residente in
frameworks/av/
fornisce un equivalente nativo alle classiCameraDevice
eCameraCaptureSession
. Vedi anche la documentazione di riferimento di NDK camera2. - Interfaccia IPC di Binder
- L'interfaccia del binder IPC facilita la comunicazione oltre i confini dei processi.
Nella directory
frameworks/av/camera/camera/aidl/android/hardware
sono presenti diversi binder della videocamera che richiamano il servizio della videocamera.ICameraService
è l'interfaccia del servizio della videocamera;ICameraDeviceUser
è l'interfaccia di un dispositivo della videocamera aperto specifico;ICameraServiceListener
eICameraDeviceCallbacks
sono i rispettivi callbackCameraService
eCameraDevice
per il framework dell'app. - servizio di fotocamere
- Il servizio della 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 invocata dal servizio della videocamera e che devi implementare per il corretto funzionamento dell'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 affinché le app possano operare correttamente l'hardware della videocamera. Le interfacce HIDL per l'HAL della fotocamera sono definite in hardware/interfaces/camera.
Un HAL con binder deve implementare le seguenti interfacce HIDL:
-
ICameraProvider
: per enumerare i singoli dispositivi e gestire il loro stato. -
ICameraDevice
: l'interfaccia del dispositivo della videocamera. -
ICameraDeviceSession
: l'interfaccia della sessione del dispositivo della videocamera attiva.
Le implementazioni HIDL di riferimento sono disponibili per
CameraProvider.cpp
,
CameraDevice.cpp
, e
CameraDeviceSession.cpp
.
L'implementazione racchiude i vecchi HAL che utilizzano ancora la
API precedente.
A partire da Android 8.0, le implementazioni HAL della fotocamera devono utilizzare l'API HIDL. L'utilizzo
dell'interfaccia precedente non è supportato.
Convalida dell'input
Poiché l'HAL ha accesso a risorse diverse rispetto al servizio della videocamera, il confine tra i due viene considerato un confine di sicurezza. Ciò significa che i parametri passati dal servizio della videocamera sono considerati non attendibili e non sottoposti a sanificazione. Per evitare vulnerabilità di sicurezza che consentono agli utenti malintenzionati di elevare i privilegi o accedere a dati a cui non è previsto che abbiano accesso, l'HAL della fotocamera deve convalidare i parametri passati dal servizio della fotocamera all'HAL. Ciò include il controllo che i valori di lunghezza del buffer rientrino negli intervalli consentiti e la sanitizzazione dei parametri prima dell'uso e prima di trasmetterli ai driver hardware o del kernel.
Componenti HAL legacy
Questa sezione descrive l'architettura dei componenti HAL precedenti 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 (legacy)
La figura e l'elenco seguenti descrivono i componenti HAL della videocamera precedenti.
![Architettura della fotocamera Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera.png?authuser=3&hl=it)
Figura 2. Architettura della videocamera precedente
- framework per 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. All'interno, questo codice chiama una classe di collegamento JNI 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 fotocamera 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 della fotocamera. - Proxy IPC di Binder
- I proxy del binder IPC facilitano la comunicazione oltre i confini dei processi.
Esistono tre classi di binder della videocamera nella directory
frameworks/av/camera
che chiamano il servizio della videocamera.ICameraService
è l'interfaccia del servizio della videocamera,ICamera
è l'interfaccia di un dispositivo della videocamera aperto specifico eICameraClient
è l'interfaccia del dispositivo con il framework dell'app. - servizio di fotocamere
- Il servizio della 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 invocata dal servizio della videocamera e che devi implementare per il corretto funzionamento dell'hardware della videocamera.
- driver del kernel
- Il driver della videocamera interagisce con l'hardware della videocamera effettiva e con l'implementazione dell'HAL. La videocamera e il driver devono supportare i formati di 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 affinché le app possano operare 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, ad esempio l'ID della videocamera e le proprietà comuni a tutte le videocamere (ad esempio 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 struttura camera_device
che a sua volta contiene una struttura camera_device_ops
con puntatori alle 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 a cui fa riferimento int
(*set_parameters)(struct camera_device *, const char *parms)
nell'HAL.
Per un esempio di implementazione di HAL, consulta l'implementazione per l'HAL Galaxy Nexus in hardware/ti/omap4xxx/camera
.
Configurare la libreria condivisa
Configura il sistema di compilazione Android in modo da pacchettizzare correttamente l'implementazione HAL in una libreria condivisa e copiarla 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 compilare la libreria condivisa. Assicurati che il file makefile contenga le seguenti righe:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
La raccolta deve avere il nome
camera.<device_name>
(.so
viene aggiunto automaticamente) in modo che Android possa caricarla correttamente. Per un esempio, consulta il file make per la videocamera Galaxy Nexus inhardware/ti/omap4xxx/Android.mk
. - Specifica che il tuo dispositivo è dotato di funzionalità della fotocamera copiando i file XML delle funzionalità necessarie nella directory
frameworks/native/data/etc
con il file make del dispositivo. Ad esempio, per specificare che il tuo dispositivo ha un flash della fotocamera e può usare l'autofocus, aggiungi le seguenti righe nel file make<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 file make del dispositivo, consulta
device/samsung/tuna/device.mk
. - Dichiara le funzionalità di codec, formato e risoluzione multimediali della fotocamera nei file XML
device/<company_name>/<device_name>/media_profiles.xml
edevice/<company_name>/<device_name>/media_codecs.xml
. Per maggiori dettagli, consulta Esporre i codec al framework. - Aggiungi le seguenti righe al
device/<company_name>/<device_name>/device.mk
makefile 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 file makedevice/<company>/<device>/device.mk
del dispositivo:PRODUCT_PACKAGES := \ Gallery2 \ ...