In Android 12 e versioni successive, Android può utilizzare facoltativamente un
Global Navigation Satellite System (GNSS) per suggerire orari Unix epoch al servizio
time_detector
.
Questa opzione non è attivata per impostazione predefinita in AOSP.
Quando il rilevamento dell'ora GNSS è attivato, gnss_time_update_service
ascolta passivamente
gli aggiornamenti della posizione dalle origini GNSS e invia i suggerimenti GNSS al
servizio time_detector
. Il servizio time_detector
determina quindi se aggiornare l'orologio di sistema in base al suggerimento.
Impatto sul consumo energetico
AOSP gnss_time_update_service
ascolta passivamente gli aggiornamenti della posizione. Ciò
significa che il servizio non attiva mai attivamente il GPS e non consuma energia
aggiuntiva. Ciò significa anche che, a meno che un'altra app o un altro servizio nel sistema non richieda
attivamente aggiornamenti della posizione, gnss_time_update_service
non riceverà un
aggiornamento della posizione e non suggerirà un orario GNSS.
Implementazione
Per abilitare il rilevamento dell'ora GNSS, i produttori di dispositivi devono abilitare esplicitamente
gnss_time_update_service
nel server di sistema.
Per attivare questa funzionalità, è necessario aggiornare sia i valori config_enableGnssTimeUpdateService
sia quelli config_autoTimeSourcesPriority
nel file core/res/res/values/config.xml
. Imposta il valore di
config_enableGnssTimeUpdateService
su true
e aggiungi gnss
all'elenco degli elementi
per config_autoTimeSourcesPriority
. La posizione di gnss
nell'elenco
delle priorità determina la priorità assegnata ai suggerimenti GNSS rispetto a quelli
di altre fonti.
Di seguito è riportato un esempio di file core/res/res/values/config.xml
in cui è abilitato il rilevamento dell'ora GNSS e gnss
è al terzo posto nell'elenco delle priorità dopo network
e telephony
:
<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
take precedence over lower ones.
See com.android.server.timedetector.TimeDetectorStrategy for available sources. -->
<string-array name="config_autoTimeSourcesPriority">
<item>network</item>
<item>telephony</item>
<item>gnss</item>
</string-array>
<!-- Enables the GnssTimeUpdate service. This is the global switch for enabling Gnss time based
suggestions to TimeDetector service. See also config_autoTimeSourcesPriority. -->
<bool name="config_enableGnssTimeUpdateService">true</bool>
Debug e test
Per testare il rilevamento dell'ora GNSS, utilizza i comandi adb shell cmd location
.
Utilizza questi comandi per aggiungere fornitori di località di test in cui puoi specificare una
località e l'ora GNSS associata. gnss_time_update_service
ascolta
questi aggiornamenti della posizione e fornisce suggerimenti periodicamente.
Di seguito sono riportati esempi di comandi adb shell cmd location
:
Attiva l'opzione di posizione principale per l'utente in primo piano (di solito l'utente
10
sull'auto). Se hai appena eseguito il flashing, puoi farlo tramite la procedura guidata di configurazione.adb shell cmd location set-location-enabled true --user 10
Aggiungi il fornitore di test GPS (in genere non riesce al primo tentativo e genera un'eccezione di sicurezza con
android from <SOME_UID> not allowed to perform MOCK_LOCATION
)adb shell cmd location providers add-test-provider gps
Attiva le autorizzazioni di accesso alla posizione fittizia per l'UID precedente
adb shell appops set UID_PRINTED_IN_PREVIOUS_ERROR android:mock_location allow
Aggiungi il fornitore di test GPS (dovrebbe funzionare senza errori)
adb shell cmd location providers set-test-provider-enabled gps true
Abilitare il provider di test GPS
adb shell cmd location providers set-test-provider-enabled gps true
Imposta la posizione con l'ora (l'ora non può essere inferiore al limite impostato dal limite inferiore)
adb shell cmd location providers set-test-provider-location gps --location LATITUDE,LONGITUDE --time TIME