Rilevamento dell'ora GNSS

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