Multi-HAL per i sensori è un framework che consente l'esecuzione di HAL per i sensori insieme ad altre HAL per i sensori. 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 sotto-HAL dei sensori è un HAL dei sensori integrato in un oggetto condiviso nella partizione del fornitore e utilizzato dal framework multi-HAL. Questi sotto-HAL non dipendono tra loro o dal codice multi-HAL che contiene la funzione principale per il processo.
Sensors Multi-HAL 2.1, disponibile sui dispositivi con sistema operativo Android 11 o versioni successive, è un'iterazione di Sensors Multi-HAL 2.0 che supporta il caricamento di sub-HAL che possono esporre il tipo di sensore angolo di cerniera. Per supportare questo tipo di sensore, i sub-HAL devono utilizzare le API sub-HAL definite nell'intestazione SubHal 2.1.
Per i dispositivi con Android 13 o versioni successive che utilizzano il Sensors AIDL HAL, puoi utilizzare il livello shim multi-HAL per consentire la 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
Sensors Multi-HAL 2, disponibile sui dispositivi con Android 10 o versioni successive, introduce diverse astrattive su Sensors HAL 2 per semplificare l'interazione 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 da quella di
2.1/ISensors.hal
(o
2.0/ISensors.hal
)
per i seguenti motivi:
- Il metodo initialize passa una classe
IHalProxyCallback
instead of two FMQs andISensorsCallback
. - Gli HAL secondari devono implementare una funzione di debug per fornire informazioni di debugging 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. Anziché fornire FMQ, l'interfaccia IHalProxyCallback
fornisce due metodi: uno per pubblicare eventi del sensore nel framework di gestione dei sensori e uno per creare blocchi di riattivazione. 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. È vivamente consigliato che gli HAL secondari utilizzino il metodo createScopedWakelock
per delegare il compito di gestire il timeout delle chiavi di attivazione al multi-HAL Sensors e per centralizzare l'utilizzo delle chiavi di attivazione in una singola chiave di attivazione comune per l'intero multi-HAL Sensors, il che riduce al minimo le chiamate di blocco e sblocco.
Sensors Multi-HAL 2 dispone anche di alcune funzionalità di sicurezza integrate. Gestisce le situazioni in cui la coda FMQ del sensore è piena o in cui il framework del sensore Android si riavvia 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.
Codice sorgente e implementazione di riferimento
Tutto il codice Multi-HAL dei sensori è disponibile in
hardware/interfaces/sensors/common/default/2.X/multihal/
.
Ecco alcuni suggerimenti per 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, utilizza la versione 2.0 di
SubHal.h
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/
: Questi test di unità verificano l'implementazione diHalProxy
.hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
: questo esempio di implementazione di sub-HAL utilizza sensori falsi per generare dati falsi. Utile per testare il modo in cui più HAL secondari interagiscono su un dispositivo.
Implementazione
Questa sezione descrive come implementare Multi-HAL per i sensori nelle seguenti situazioni:
- Utilizzare il multi-HAL Sensors con l'HAL AIDL Sensors
- Implementazione di Sensors Multi-HAL 2.1
- Porting da Sensors Multi-HAL 2.0 a Multi-HAL 2.1
- Porting da Sensors HAL 2.0
- Porting da Sensors HAL 1.0
- Porting da Sensors 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. Il livello shim multi-HAL AIDL è compatibile con i dispositivi che implementano Sensors 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 utilizzare questi tipi di sensori definiti dall'interfaccia HAL AIDL, imposta il campo type
nella struttura SensorInfo
nell'implementazione getSensorsList_2_1()
. Questo è sicuro perché i campi del tipo di sensore basati su interi dell'HAL dei sensori AIDL e HIDL non si sovrappongono.
Implementare Sensors 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 creare il sotto-HAL appena implementato. Quando aggiungi il target:- Assicurati che il target venga inviato da qualche parte nella partizione del fornitore del dispositivo.
- Nel file di configurazione in
/vendor/etc/sensors/hals.conf
, aggiungi il percorso della libreria in una nuova riga. Se necessario, crea il filehals.conf
.
Per un esempio di voce
Android.bp
per la creazione di una libreria HAL secondaria, 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 file del servizio
android.hardware.sensors
eservice.rc
dal filedevice.mk
e aggiungiandroid.hardware.sensors@2.1-service.multihal
eandroid.hardware.sensors@2.1-service.multihal.rc
aPRODUCT_PACKAGES
.
All'avvio, HalProxy
si avvia, cerca il sub-HAL appena implementato e lo inizializza chiamando sensorsHalGetSubHal_2_1
.
Eseguire la migrazione da Multi-HAL 2.0 a Multi-HAL 2.1 per i sensori
Per eseguire il porting da Multi-HAL 2.0 a Multi-HAL 2.1, implementa l'interfaccia SubHal
e ricompila il sotto-HAL.
Di seguito sono riportate le differenze tra le interfacce SubHal
2.0 e 2.1:
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
instead ofgetSensorsList
einjectSensorData
poiché questi metodi utilizzano i nuovi tipi aggiunti nella versione 2.1 della specificaISensors.hal
. - I sub-HAL devono esporre
sensorsHalGetSubHal_2_1
anzichésensorsHalGetSubHal
affinché Multi-HAL li tratti come sub-HAL della versione 2.1.
Porta da Sensors 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
Sensors HAL 2.0 ha una funzione di inizializzazione che consente al servizio del sensore di trasmettere FMQ e un callback del sensore dinamico. In Sensors Multi-HAL 2.0, la funzione
initialize()
passa un singolo callback che deve essere utilizzato per pubblicare
eventi del sensore, ottenere blocchi di attivazione e notificare la connessione e la disconnessione dinamica dei sensori.
Pubblicare gli eventi del sensore nell'implementazione Multi-HAL
Anziché pubblicare gli eventi del sensore tramite la coda FMQ, l'HAL secondario deve scrivere gli eventi del sensore in IHalProxyCallback
quando sono disponibili.
Eventi WAKE_UP
In Sensors HAL 2.0, l'HAL può gestire il blocco di attivazione per la sua implementazione. In
Sensors Multi-HAL 2.0, gli HAL secondari consentono all'implementazione Multi-HAL di gestire i wakelock e possono richiedere l'acquisizione di un wakelock chiamando
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
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 sono disponibili come parte del puntatore IHalProxyCallback
fornito tramite la funzione initialize()
.
Porta da Sensors HAL 1.0
Quando esegui l'upgrade a Sensors Multi-HAL 2.0 da Sensors HAL 1.0, assicurati che l'implementazione di HAL soddisfi i seguenti requisiti.
Inizializza 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
In Sensors HAL 2.0, anziché attendere la chiamata di poll()
, il sub-HAL deve scrivere in modo proattivo gli eventi del sensore in IHalProxyCallback
ogni volta che sono disponibili.
Eventi WAKE_UP
In Sensors HAL 1.0, l'HAL può gestire il blocco di attivazione per la sua implementazione. In
Sensors Multi-HAL 2.0, gli HAL secondari consentono all'implementazione Multi-HAL di gestire i wakelock e possono richiedere l'acquisizione di un wakelock chiamando
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
In Sensors 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 sono disponibili 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 tutti i riferimenti a
hardware/hardware.h
ehardware/sensors.h
in quanto non sono supportati per HAL 2.0. - Esegui il porting dei sotto-HAL come descritto in Porting da Sensors 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
Esegui test di unità
I test delle unità nel HalProxy_test.cpp
test HalProxy
utilizzano sotto-HAL falsi che vengono attivati nel test delle unità e non vengono caricati dinamicamente. Quando crei un nuovo sotto-HAL, questi test dovrebbero fungere da guida su come aggiungere test di unità che verifichino che il nuovo sotto-HAL sia implementato correttamente.
Per eseguire i test, esegui i seguenti comandi:
cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest
Esegui il test con gli HAL secondari falsi
I sub-HAL falsi sono implementazioni simulate 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 sottoporre a stress vari aspetti del codice Multi-HAL dei sensori.
Due HAL secondari falsi sono disponibili all'indirizzo
hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/
.
Per compilare e inviare gli HAL secondari falsi a un dispositivo, svolgi i seguenti passaggi:
Esegui i seguenti comandi per compilare ed eseguire il push dei tre diversi sub-HAL falsi sul 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 l'output di debug dell'HAL Sensors, esegui il seguente 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 del comando per l'oggetto HalProxy
e gli HAL secondari 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ù), indica che ci sono molti eventi in attesa di essere scritti nel framework dei sensori. Ciò indica che il servizio del sensore è in stato di deadlock o si è arrestato in modo anomalo e non elabora gli eventi del sensore oppure che di recente è stato pubblicato un lotto di eventi del sensore da un HAL secondario.
Se il conteggio dei riferimenti di blocco risveglio è maggiore di 0
, significa che HalProxy
ha acquisito un blocco risveglio. Questo valore deve essere maggiore di 0
solo se un ScopedWakelock
viene tenuto intenzionalmente premuto o se gli eventi di risveglio sono stati inviati a HalProxy
e non sono stati
elaborati dal framework del sensore.
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
.