Sensors Multi-HAL è un framework che consente ai sensori HAL di funzionare di altri sensori HAL. Il multi-HAL dei sensori carica dinamicamente i sotto-HAL dei sensori memorizzati come librerie dinamiche nella partizione del fornitore e fornisce loro un oggetto di callback in grado di gestire la pubblicazione di eventi e l'acquisizione e il rilascio del blocco di attivazione. Un sensore sub-HAL è un HAL di sensori integrato in un oggetto condiviso sulla del fornitore ed è utilizzata dal framework multi-HAL. Questi sotto-HAL non dipendono tra loro o dal codice multi-HAL che contiene la funzione principale per il processo.
Sensori Multi-HAL 2.1, disponibile sui dispositivi con Android 11 o superiore, è un l'iterazione di sensori Multi-HAL 2.0 che supporta il caricamento di sub-HAL che possono esporre angolo cerniera tipo di sensore. Per supportare questo tipo di sensore, gli HAL sub-HAL devono utilizzare le API sub-HAL definita nel 2.1 Intestazione SubHal.
Per i dispositivi con Android 13 o versioni successive che utilizzano Sensors AIDL HAL, puoi utilizzare strato shim multi-HAL per consentire funzionalità multi-HAL. Per i dettagli sull'implementazione, consulta Utilizzare il multi-HAL Sensors con l'HAL AIDL Sensors.
Differenza tra Sensors Multi-HAL 2 e Sensors HAL 2
Sensori Multi-HAL 2, disponibili sui dispositivi con Android
10 o successive,
introduce diverse astrazioni oltre a Sensors HAL
2 per semplificare
per interagire con le API HAL. Sensors Multi-HAL 2 introduce la classe
HalProxy
per gestire l'implementazione dell'interfaccia Sensors HAL 2 e dell'interfaccia
V2_1/SubHal
(o
V2_0/SubHal
)
per consentire a HalProxy
di interagire con i sub-HAL.
L'interfaccia di ISensorsSubHal
è diversa dalla
2.1/ISensors.hal
(o
2.0/ISensors.hal
)
dell'interfaccia nel seguente modo:
- Il metodo di inizializzazione trasmette un valore
IHalProxyCallback
anziché due FMQ eISensorsCallback
. - Gli HAL secondari devono implementare una funzione di debug per fornire il debug nelle segnalazioni di bug.
- I sub-HAL devono implementare una funzione di nome in modo che il sub-HAL caricato possa essere distinto da altri sub-HAL.
La differenza principale tra Sensors Multi-HAL 2 e Sensors HAL 2 è nelle funzioni di inizializzazione. Invece di fornire FMQ, IHalProxyCallback
offre due metodi: uno per inviare gli eventi dei sensori ai sensori
e un metodo per creare i wakelock. Sotto il cofano, il Multi-HAL dei sensori gestisce tutte le interazioni con le FMQ per garantire l'invio tempestivo degli eventi dei sensori per tutti i sub-HAL. Consigliamo vivamente agli HAL secondari di utilizzare
Metodo createScopedWakelock
per delegare l'onere del timeout dei wakelock a
l'uso dei sensori Multi-HAL e di centralizzare l'utilizzo dei wakelock in base a un solo wakelock comune
per l'intero HAL Sensors, che riduce al minimo il blocco e lo sblocco delle chiamate.
Sensori L'Multi-HAL 2 dispone anche di alcune funzioni di sicurezza integrate. Gestisce
situazioni in cui il valore FMQ del sensore è completo o il framework dei sensori Android
e lo stato del sensore deve essere reimpostato. Inoltre, quando gli eventi vengono pubblicati nella classe HalProxy
, ma il framework del sensore non è in grado di accettarli immediatamente, il multi-HAL dei sensori può spostarli in un thread in background per consentire il proseguimento del lavoro in tutti i sub-HAL in attesa della pubblicazione degli eventi.
Implementazione del codice sorgente e del riferimento
Il codice Multi-HAL per tutti i sensori è disponibile in
hardware/interfaces/sensors/common/default/2.X/multihal/
Di seguito sono riportati alcuni rimandi ad alcune risorse.
HalProxy.h
: l'oggettoHalProxy
viene creato da Sensors multi-HAL e gestisce il trasferimento dei dati dalle HAL secondarie al framework del sensore.HalProxy.cpp
: l'implementazione diHalProxy
contiene tutta la logica necessaria per multiplexare la comunicazione tra i sub-HAL e il framework del sensore.SubHal.h
: l'interfacciaISensorsSubHal
definisce l'interfaccia che gli HAL secondari devono seguire per essere compatibili conHalProxy
. L'HAL secondario implementa il metodo initialize in modo che l'oggettoHalProxyCallback
possa essere utilizzato perpostEvents
ecreateScopedWakelock
.Per le implementazioni Multi-HAL 2.0, usare la versione 2.0 di
SubHal.h
hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: Questi test delle unità verificano l'implementazione diHalProxy
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: Questa implementazione di esempio sub-HAL utilizza sensori falsi per generare e i dati di Google Cloud. Utile per testare il modo in cui più HAL secondari interagiscono su un dispositivo.
Implementazione
Questa sezione descrive come implementare i sensori Multi-HAL nelle seguenti sezioni situazioni seguenti:
- Utilizzo di Sensors Multi-HAL con Sensors AIDL HAL
- Implementazione di Sensors Multi-HAL 2.1
- Trasferimento da Sensori Multi-HAL 2.0 a Multi-HAL 2.1
- Portabilità dai sensori HAL 2.0
- Porting da Sensors HAL 1.0
- Portabilità da sensori Multi-HAL 1.0
Utilizzare il multi-HAL Sensors con l'HAL AIDL Sensors
Per consentire la funzionalità multi-HAL con l'HAL AIDL Sensors, importa il modulo del livello shim multi-HAL AIDL, che si trova in hardware/interfaces/sensors/aidl/default/multihal/. Il modulo gestisce la conversione tra i tipi di definizione HAL dei sensori AIDL e HIDL e definisce un wrapper per l'interfaccia multi-HAL descritta in Implementing Sensors Multi-HAL 2.1. AIDL multi-HAL lo strato di spessore è compatibile con i dispositivi che implementano Sensori Multi-HAL 2.1.
Il livello shim multi-HAL AIDL consente di esporre il tracker per la testa e i tipi di sensori IMU a assi limitati nell'HAL AIDL Sensors. Per usare questi sensori
tipi definiti dall'interfaccia AIDL HAL, imposta il campo type
nella
struct SensorInfo
nell'implementazione getSensorsList_2_1()
. È sicuro
perché i campi del tipo di sensore con supporto di numeri interi dei sensori AIDL e HIDL HAL
non si sovrappongano.
Implementazione di sensori Multi-HAL 2.1
Per implementare Sensors Multi-HAL 2.1 su un nuovo dispositivo, segui questi passaggi:
- Implementa l'interfaccia
ISensorsSubHal
come descritto inSubHal.h
- Implementa il metodo
sensorsHalGetSubHal_2_1
inSubHal.h
. Aggiungi un target
cc_library_shared
per compilare il sotto-HAL appena implementato. Quando aggiungi il target:- Assicurati che il target venga inviato a una destinazione sul fornitore del dispositivo.
- Nel file di configurazione all'indirizzo
/vendor/etc/sensors/hals.conf
, aggiungere il percorso alla libreria su una nuova riga. Se necessario, crea ilhals.conf
file.
Per un esempio di voce
Android.bp
per la creazione di una libreria sub-HAL, consultahardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp
Rimuovi tutte le voci
android.hardware.sensors
dalmanifest.xml
file, che contiene l'elenco degli HAL supportati sul dispositivo.Rimuovi tutti i servizi
android.hardware.sensors
eservice.rc
file da il filedevice.mk
e aggiungiandroid.hardware.sensors@2.1-service.multihal
e daandroid.hardware.sensors@2.1-service.multihal.rc
aPRODUCT_PACKAGES
,
All'avvio, HalProxy
si avvia, cerca l'HAL secondario appena implementato e
la inizializza richiamando
sensorsHalGetSubHal_2_1
Porta da Sensori Multi-HAL 2.0 a Multi-HAL 2.1
Per eseguire il porting da Multi-HAL 2.0 a Multi-HAL 2.1, implementa l'interfaccia
SubHal
e ricompila il sotto-HAL.
Ecco le differenze tra le interfacce 2.0 e 2.1 di SubHal
:
IHalProxyCallback
utilizza i tipi creati nella versione 2.1 della specificaISensors.hal
.- La funzione
initialize()
passa un nuovoIHalProxyCallback
invece di quello dell'interfacciaSubHal
2.0 - Gli HAL secondari devono implementare
getSensorsList_2_1
einjectSensorData_2_1
anzichégetSensorsList
einjectSensorData
poiché questi metodi utilizzano i nuovi tipi aggiunti nella versione 2.1 della specificaISensors.hal
. - Gli HAL secondari devono esporre
sensorsHalGetSubHal_2_1
anzichésensorsHalGetSubHal
per l'HAL Multi-HAL per considerarli come versione 2.1 sub-HAL.
Porta da sensori HAL 2.0
Quando esegui l'upgrade a Sensors Multi-HAL 2.0 da Sensors HAL 2.0, assicurati che l'implementazione di HAL soddisfi i seguenti requisiti.
Inizializza l'HAL
Sensori HAL 2.0 ha una funzione di inizializzazione che consente al servizio
superare gli FMQ e il callback del sensore dinamico. In Sensors Multi-HAL 2.0, il parametro
La funzione initialize()
passa un singolo callback che deve essere utilizzato per pubblicare
eventi dei sensori, ottenere wakelock, nonché notificare la connessione dei sensori dinamici e
disconnessioni.
Dopo gli eventi dei sensori nell'implementazione Multi-HAL
Anziché pubblicare gli eventi del sensore tramite FMQ, l'HAL secondario deve scrivere il sensore
eventi alla
IHalProxyCallback
quando sono disponibili eventi dei sensori.
Eventi WAKE_UP
In Sensors HAL 2.0, l'HAL può gestire il blocco di attivazione per la sua implementazione. Nella
Sensori Multi-HAL 2.0, i sub-HAL consentono l'implementazione
gestire i wakelock e richiedere l'acquisizione di un wakelock richiamando
createScopedWakelock
Un wakelock con ambito bloccato deve essere acquisito e passato a postEvents
quando
pubblicare eventi di riattivazione nell'implementazione Multi-HAL.
Sensori dinamici
Sensori Multi-HAL 2.0 richiede che onDynamicSensorsConnected
e
onDynamicSensorsDisconnected
pollici
IHalProxyCallback
:
vengono richiamati ogni volta che le connessioni dei sensori dinamici cambiano. Questi callback sono disponibili come parte del puntatore IHalProxyCallback
fornito tramite la funzione initialize()
.
Porta da Sensors HAL 1.0
In caso di upgrade a Sensors Multi-HAL 2.0 da Sensors HAL 1.0, assicurati che l'HAL la tua implementazione soddisfi i seguenti requisiti.
Inizializzare l'HAL
La funzione initialize()
deve essere supportata per stabilire il callback tra il sub-HAL e l'implementazione Multi-HAL.
Esporre i sensori disponibili
In Sensors Multi-HAL 2.0, la funzione getSensorsList()
deve restituire lo stesso valore durante un singolo avvio del dispositivo, anche dopo i riavvii dell'HAL dei sensori. In questo modo, il framework può tentare di ristabilire le connessioni dei sensori se il server di sistema si riavvia. Il valore restituito da getSensorsList()
può cambiare dopo il riavvio del dispositivo.
Pubblicare gli eventi del sensore nell'implementazione Multi-HAL
Nei sensori HAL 2.0, invece di attendere la chiamata poll()
, viene usato lo stato sub-HAL
devono scrivere in modo proattivo gli eventi dei sensori
IHalProxyCallback
ogni volta che sono disponibili eventi dei sensori.
Eventi WAKE_UP
In Sensors HAL 1.0, l'HAL può gestire il blocco di attivazione per la sua implementazione. Nella
Sensori Multi-HAL 2.0, il sub-HAL consente l'implementazione
gestire i wakelock e richiedere l'acquisizione di un wakelock richiamando
createScopedWakelock
È necessario acquisire e passare un blocco di riattivazione con ambito bloccato a postEvents
quando si pubblicano eventi di riattivazione nell'implementazione Multi-HAL.
Sensori dinamici
Nei sensori HAL 1.0, i sensori dinamici vengono restituiti tramite la funzione poll()
.
Sensors Multi-HAL 2.0 richiede che onDynamicSensorsConnected
e
onDynamicSensorsDisconnected
in
IHalProxyCallback
vengano chiamati ogni volta che le connessioni dei sensori dinamici cambiano. Questi callback vengono
disponibile come parte del puntatore IHalProxyCallback
fornito tramite
la funzione initialize()
.
Porta da Sensors Multi-HAL 1.0
Per eseguire il porting di un'implementazione esistente da Sensors Multi-HAL 1.0, segui questi passaggi.
- Assicurati che la configurazione HAL dei sensori si trovi in
/vendor/etc/sensors/hals.conf
. Potrebbe essere necessario spostare il file situato in/system/etc/sensors/hals.conf
. - Rimuovi eventuali riferimenti a
hardware/hardware.h
ehardware/sensors.h
poiché non sono supportati per HAL 2.0. - Porta gli HAL sub-HAL come descritto in Portabilità da sensori Hal 1,0.
- Imposta Sensors Multi-HAL 2.0 come HAL designato seguendo i passaggi 3 e 4 della sezione Implementazione di Sensors Multi-HAL 2.0.
Convalida
Esegui VTS
Dopo aver integrato uno o più HAL secondari con Sensors Multi-HAL 2.1, utilizza la Vendor Test Suite (VTS) per assicurarti che le implementazioni degli HAL secondarisoddisfano tutti i requisiti impostati dall'interfaccia HAL di Sensors.
Per eseguire solo i test VTS dei sensori quando VTS è configurato su un computer host, esegui i seguenti comandi:
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_0Target && \
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsHalSensorsV2_1Target
Se stai eseguendo il livello shim AIDL Multi-HAL, esegui VtsAidlHalSensorsTargetTest
.
vts-tradefed run commandAndExit vts \
--skip-all-system-status-check \
--primary-abi-only \
--skip-preconditions \
--module VtsAidlHalSensorsTargetTest
Esecuzione dei test delle unità
Il test delle unità in HalProxy_test.cpp
esegue il test HalProxy
utilizzando HAL sub-HAL fittizi che
vengono create in modo dinamico nel test delle unità e non vengono caricate in modo dinamico. Quando crei un
nuovo sub-HAL, questi test dovrebbero servire da guida su come aggiungere test delle unità che
verifica che il nuovo sub-HAL sia implementato correttamente.
Per eseguire i test, esegui questi comandi:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
Esegui il test con gli HAL secondari falsi
Gli HAL secondari falsi sono implementazioni dummy dell'interfaccia ISensorsSubHal
.
Gli HAL secondari mostrano diversi elenchi di sensori. Quando i sensori sono attivati, postano periodicamente eventi generati automaticamente su HalProxy
in base agli intervalli specificati in una determinata richiesta del sensore.
I sub-HAL falsi possono essere utilizzati per testare il funzionamento del codice Multi-HAL completo con altri sub-HAL caricati nel sistema e per mettere in evidenza vari aspetti del codice Multi-HAL dei sensori.
Sono disponibili due falsi sub-HAL all'indirizzo
hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
Per creare ed eseguire il push di HAL secondari falsi a un dispositivo, procedi nel seguente modo:
Esegui questi comandi per creare ed eseguire il push dei tre diversi falsi HAL secondari al dispositivo:
$ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
mma
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
adb push \ $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \ /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
Aggiorna la configurazione HAL dei sensori in
/vendor/etc/sensors/hals.conf
con i percorsi per i sub-HAL falsi./vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
Riavvia
HalProxy
e carica i nuovi sotto-HAL elencati nella configurazione.adb shell stop
adb shell start
Debug…
Gli sviluppatori possono eseguire il debug del framework utilizzando il comando lshal
. Per richiedere il
dell'output di debug dell'HAL per i sensori, esegui questo comando:
adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default
Le informazioni sullo stato corrente di HalProxy
e dei relativi HAL secondari vengono quindi messe in output nel terminale. Di seguito è riportato un esempio dell'output comando per
Oggetto HalProxy
e sub-HAL falsi.
Internal values:
Threads are running: true
Wakelock timeout start time: 200 ms ago
Wakelock timeout reset time: 73208 ms ago
Wakelock ref count: 0
# of events on pending write queue: 0
# of non-dynamic sensors across all subhals: 8
# of dynamic sensors across all subhals: 0
SubHals (2):
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Name: FakeSubHal-OnChange
Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
Se il numero specificato per # of events on pending write queue
è un
numero elevato (1000 o più),
Ciò indica che ci sono molti eventi in attesa di essere scritti sui sensori
il modello di machine learning. Questo indica che il servizio dei sensori è in un deadlock o si è arrestato in modo anomalo.
non elabora gli eventi dei sensori o che un gran numero di eventi
ha pubblicato di recente da un sub-HAL.
Se il conteggio dei rif wakelock è maggiore di 0
, significa che HalProxy
ha
ha acquisito un wakelock. Questo valore deve essere superiore a 0
solo se un ScopedWakelock
viene tenuto intenzionalmente o se gli eventi di sveglia sono stati inviati a HalProxy
e
non sono stati elaborati dal framework dei sensori.
Il descrittore file passato al metodo di debug di HalProxy
viene passato a ogni
sub-HAL, pertanto gli sviluppatori devono implementare il metodo di debug nell'ambito dell'interfaccia
ISensorsSubHal
.