![Icona HAL della fotocamera Android](https://source.android.com/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=8&hl=it)
L'HAL (Camera Hardware Astrazione Layer) di Android connette le reti di le API del framework della videocamera Videocamera 2 al driver e all'hardware della videocamera di base. Il sottosistema delle fotocamere include implementazioni per i componenti della pipeline della videocamera mentre l'HAL della videocamera fornisce interfacce da usare per implementare la tua versione di questi componenti.
Architettura
La figura e l'elenco seguenti descrivono i componenti dell'HAL.
![Architettura della fotocamera Android](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=8&hl=it)
Figura 1. Architettura della fotocamera
- framework dell'app
- A livello di framework dell'app si trova il codice dell'app, che utilizza API Camera 2 per interagire con l'hardware della videocamera. Internamente, questo codice chiamate corrispondenti Binder per accedere al codice nativo che interagisce con fotocamera.
- AIDL
- L'interfaccia di binder associata a
CameraService
può essere disponibile in . frameworks/av/camera/aidl/android/hardware. Il codice generato chiama il codice nativo di livello inferiore per ottenere l'accesso fotocamera fisica e restituisce i dati utilizzati per creareCameraDevice
e alla fineCameraCaptureSession
a livello di framework. - framework nativo
- Questo framework presente in
frameworks/av/
fornisce una nativo equivalente .CameraDevice
eCameraCaptureSession
. Vedi anche Riferimento videocamera NDK 2. - interfaccia IPC binder
- L'interfaccia di binder IPC facilita la comunicazione oltre i confini dei processi.
Nella
frameworks/av/camera/camera/aidl/android/hardware
directory che chiamata al servizio videocamera.ICameraService
è l'interfaccia per il servizio videocamera;ICameraDeviceUser
è l'interfaccia per uno specifico videocamera; eICameraServiceListener
eICameraDeviceCallbacks
sono i rispettiviCameraService
eCameraDevice
richiamano al un framework per app. - servizio videocamera
- Il servizio di fotocamere, situato in
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, è il codice che interagisce con l'HAL. - HAL
- Il livello di astrazione hardware definisce l'interfaccia standard che devi implementare per far sì che la videocamera che l'hardware funzioni correttamente.
Implementare l'HAL
L'HAL si trova a metà strada tra il driver della fotocamera e il framework Android di livello superiore e definisce un'interfaccia che è necessario implementare affinché le app possano funzionare correttamente dall'hardware della videocamera. L'HIDL interfacce per Camera HAL sono definite . hardware/interfacce/videocamera.
Un tipico HAL binderizzato deve implementare le seguenti interfacce HIDL:
-
ICameraProvider
: Per elencare i singoli dispositivi e gestirne lo stato. -
ICameraDevice
: L'interfaccia del dispositivo della videocamera. -
ICameraDeviceSession
: Interfaccia della sessione del dispositivo con videocamera attiva.
Le implementazioni di riferimento HIDL sono disponibili per
CameraProvider.cpp
,
CameraDevice.cpp
e
CameraDeviceSession.cpp
L'implementazione aggrega i vecchi HAL che utilizzano ancora
API legacy.
A partire da Android 8.0, le implementazioni HAL per Fotocamera devono usare l'API HIDL. utilizzare
dell'interfaccia precedente non è supportata.
Convalida degli input
Poiché l'HAL ha accesso a risorse diverse rispetto al servizio videocamera, il confine tra vengono considerati come un confine di sicurezza. Ciò significa che i parametri trasmessi dal servizio di fotocamere considerati non attendibili e non sottoposti a sanitizzazione. Per prevenire vulnerabilità di sicurezza che consentono ai malintenzionati di e aumentare i privilegi o accedere ai dati a cui non devono avere accesso, l'HAL della videocamera deve convalidare i parametri trasmessi dal servizio fotocamera all'HAL. Ciò include la verifica del buffer i valori della lunghezza rientrano negli intervalli consentiti e vengono sottoposti a sanificazione dei parametri prima dell'uso e passarle ai driver hardware o kernel.
Componenti HAL precedenti
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 l'API HIDL, descritta in precedenza.
Architettura (legacy)
La figura e l'elenco seguenti descrivono i componenti HAL della videocamera legacy.
![Architettura della fotocamera Android](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera.png?authuser=8&hl=it)
Figura 2. Architettura precedente delle fotocamere
- framework dell'app
- A livello di framework dell'app si trova il codice dell'app, che utilizza
android.hardware.Camera
per interagire con l'hardware della videocamera. Internamente, questo codice chiama una la classe di colla JNI corrispondente per accedere al codice nativo che interagisce fotocamera. - 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 creareandroid.hardware.Camera
a livello di framework. - framework nativo
- Il framework nativo definito in
frameworks/av/camera/Camera.cpp
offre un equivalente nativo .android.hardware.Camera
corso. Questa classe chiama l'IPC a proxy di binder per ottenere l'accesso al servizio di fotocamera. - proxy IPC binder
- I proxy del legante IPC facilitano la comunicazione oltre i confini dei processi.
Esistono tre classi di raccoglitore di fotocamere che si trovano nella
Directory di
frameworks/av/camera
che effettua le chiamate al servizio di videocamera.ICameraService
è l'interfaccia del servizio videocamera,ICamera
è l'interfaccia di uno specifico dispositivo con fotocamera aperta, eICameraClient
è l'interfaccia del dispositivo un framework per app. - servizio videocamera
- Il servizio di fotocamere, situato in
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, è il codice che interagisce con l'HAL. - HAL
- Il livello di astrazione hardware definisce l'interfaccia standard che devi implementare per far sì che la videocamera che l'hardware funzioni correttamente.
- driver kernel
- Il driver della videocamera interagisce con l'hardware effettivo della videocamera e implementazione dell'HAL. La fotocamera e il driver devono supportare le versioni YV12 e NV21 formati immagine per fornire un supporto per visualizzare l'anteprima dell'immagine della fotocamera sul la registrazione video e display.
Implementare l'HAL (legacy)
L'HAL si trova a metà strada tra il driver della fotocamera e il framework Android di livello superiore
e definisce un'interfaccia che è necessario implementare affinché le app possano funzionare correttamente
dall'hardware della videocamera. L'interfaccia dell'HAL è definita nel
hardware/libhardware/include/hardware/camera.h
e
hardware/libhardware/include/hardware/camera_common.h
file di intestazione.
camera_common.h
definisce camera_module
, uno standard
per ottenere informazioni generali sulla videocamera, ad esempio l'ID fotocamera
e le proprietà comuni a tutte le fotocamere (ad esempio, che si tratti di un
fotocamera posteriore).
camera.h
contiene un codice che corrisponde a
android.hardware.Camera
. Questo file di intestazione dichiara
struct camera_device
che a sua volta contiene un
struct camera_device_ops
con puntatori a funzioni che implementano
l'interfaccia dell'HAL. Per consultare la documentazione sui parametri della videocamera, gli sviluppatori possono
è impostata, consulta la sezione frameworks/av/include/camera/CameraParameters.h
.
Questi parametri sono impostati con la funzione che punta da int
(*set_parameters)(struct camera_device *, const char *parms)
nell'HAL.
Per un esempio di implementazione dell'HAL, fai riferimento all'implementazione per
Galaxy Nexus HAL in hardware/ti/omap4xxx/camera
.
Configurare la libreria condivisa
Configurare il sistema di build Android per pacchettizzare correttamente l'implementazione dell'HAL
in una libreria condivisa e copiarla nella posizione appropriata creando un
File Android.mk
:
- Crea un
device/<company_name>/<device_name>/camera
in cui inserire i file di origine della libreria. - Crea un file
Android.mk
per creare la libreria condivisa. Assicurati che il makefile contenga le righe seguenti:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
Il nome della tua raccolta deve essere
camera.<device_name>
(.so
viene aggiunto automaticamente), in modo che Android possa caricare correttamente libreria. Ad esempio, osserva il file di creazione per la fotocamera Galaxy Nexus situato inhardware/ti/omap4xxx/Android.mk
. - Specifica che il tuo dispositivo dispone delle funzionalità della fotocamera copiando il file XML delle funzionalità necessario
nella directory
frameworks/native/data/etc
con il tuo il makefile del dispositivo. Ad esempio, per specificare che il dispositivo disponga di un flash della fotocamera e puoi mettere a fuoco automaticamente, aggiungi le seguenti righe nella<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 di un dispositivo, vedi
device/samsung/tuna/device.mk
. - Dichiara le funzionalità di codec multimediale, formato e risoluzione della videocamera in
device/<company_name>/<device_name>/media_profiles.xml
edevice/<company_name>/<device_name>/media_codecs.xml
XML. Per maggiori dettagli, vedi L'esposizione dei codec ai Google Cloud. - Aggiungi le seguenti righe nella
Makefile di
device/<company_name>/<device_name>/device.mk
per copiaremedia_profiles.xml
emedia_codecs.xml
i file 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
PRODUCT_PACKAGES
nella variabile del dispositivodevice/<company>/<device>/device.mk
Makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...