Rilevamento automatico dell'ora

Il rilevamento automatico dell'ora riceve suggerimenti di tempo da varie fonti; seleziona il l'opzione migliore, quindi imposta l'orologio di sistema in Android di conseguenza. Release di Android precedenti fornite puoi impostare data e ora in due modi: manualmente per utente o tramite rilevamento automatico dell'ora, e imposta in base a una delle seguenti opzioni:

  • telephony utilizza i segnali di telefonia dell'identità di rete e del fuso orario (NITZ).
  • network utilizza i server di riferimento orario NTP (Network Time Protocol).

Ogni opzione richiede connessioni a reti esterne, che non sono sempre disponibili in Android Auto e motori. Ad esempio, in alcuni paesi alcune auto potrebbero non disporre della telefonia integrata. Pertanto, L'orario GNSS (Global Satellite Navigation Systems) viene fornito come fonte del sistema da utilizzare quando la connettività di rete non è disponibile.

In questa prossima release di Android sono disponibili altre due opzioni per rilevare e impostare automaticamente l'ora:

  • gnss utilizza il satellite globale Sistemi di navigazione (GNSS).
  • external usi una proprietà VHAL o l'API di sistema.

Attiva il rilevamento automatico del tempo

Per attivare il rilevamento automatico dell'ora, assicurati di selezionare Impostazioni > Data e Ora > Data e data automatiche Ora:

Figura 1. Seleziona Data e ora automatiche Data/ora

Configura le origini dell'ora

Per specificare le origini dell'ora da includere nel rilevamento automatico dell'ora e la priorità in cui devono essere prese in considerazione queste origini temporali, devi modificare la risorsa file di configurazione, core/res/res/values/config.xml:

<!-- 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>telephony</item>
    <item>network</item>
</string-array>

In questo esempio, telephony e network sono considerati in il rilevamento automatico del tempo e i suggerimenti di tempo per telephony hanno la priorità in anticipo rispetto a network suggerimenti di orario.

In generale, i suggerimenti provenienti da un'origine con priorità più elevata vengono ignorati se i suggerimenti non è valido o se il suggerimento è troppo vecchio. Inoltre, se il suggerimento valido con priorità più alta corrisponde all'ora attuale dell'orologio di sistema del dispositivo entro alcuni secondi (il valore predefinito è di due (2) secondi), l'ora non verrà modificata.

Limite di tempo inferiore

Android 12 offre un nuovo limite di tempo inferiore da utilizzare quando che convalidano i suggerimenti di tempo. Prima di questa funzione, il rilevamento automatico del tempo non convalidava ora UTC in arrivo suggerita. Con questa funzione, i tempi prima del limite inferiore vengono eliminato.

Il valore del limite inferiore è determinato da una data derivata dal timestamp di build. Funziona su secondo il quale non può esistere un tempo valido prima della creazione dell'immagine di sistema. Android non un limite superiore.

Suggerimenti di orario GNSS

La fonte dell'ora di gnss è nuova per Android 12 e viene fornita dai segnali GPS. Questo è una fonte attendibile per conoscere i casi in cui telephony e network non sono disponibili. Questa opzione viene aggiunta al nuovo GnssTimeUpdateService in SystemServer ascolta passivamente gli aggiornamenti della posizione. Quando viene ricevuta una sede valida, GnssTimeUpdateService dà un suggerimento a TimeDetectorService, che determina se l'orologio di sistema deve essere aggiornato.

Per impostazione predefinita, l'origine orario gnss non è abilitata in AOSP e, di conseguenza, devono essere attivati dai partner:

<!-- 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>telephony</item>
    <item>network</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>

Per attivare questa funzionalità:

  1. Aggiorna config_enableGnssTimeUpdateService. Il valore per config_enableGnssTimeUpdateService deve essere impostato su true.
  2. Aggiorna config_autoTimeSourcesPriority. gnss deve essere aggiunto al elenco di elementi per config_autoTimeSourcesPriority. La posizione di gnss dell'elenco di priorità determina la priorità assegnata ai suggerimenti GNSS rispetto ai valori provenienti da altre fonti.

Impatto sulla potenza

GnssTimeUpdateService ascolta passivamente gli aggiornamenti sulla posizione, il che significa che non accende mai attivamente il GPS per consumare più energia. Di conseguenza, la corrente consumata quando l'origine GNSS abilitata è trascurabile. Ciò significa anche che, a meno che non sia presente un'altra app o un altro servizio il sistema richiede attivamente aggiornamenti sulla posizione, GnssTimeUpdateService non ottiene una posizione aggiornare e suggerire un orario GNSS.

Test

Suite di test di compatibilità (CTS)

Viene fornito un test CTS per verificare che sia disponibile un orario fornito da GNSS. Per maggiori dettagli, vedi LocationShellCommand.java.

Test delle unità

Consulta i test delle unità di base nel seguente file:

atest frameworks/base/services/tests/servicestests/src/com/android/server/timedetector/GnssTimeUpdateServiceTest.java

Test manuali

Per testare questa funzionalità, sono stati aggiunti nuovi comandi LocationShellCommand.java. Utilizza questi comandi per aggiungere test con cui puoi specificare una località e l'orario GNSS associato. GnssTimeUpdateService ascolta questi aggiornamenti sulla posizione e periodicamente fornisce suggerimenti.

Nota:l'interfaccia di questi comandi potrebbe variare da una release all'altra.

# Enable Master Location Switch in the foreground user (usually user 10 on automotive).
# If you just flashed, this can be done through Setup Wizard.
adb shell cmd location set-location-enabled true --user 10

# Add GPS test provider (this usually fails the first time and will throw a SecurityException
# with "android from <some-uid> not allowed to perform MOCK_LOCATION".)
adb shell cmd location providers add-test-provider gps

# Enable mock location permissions for previous UID
adb shell appops set <uid printed in previous error> android:mock_location allow

# Add GPS test provider (Should work with no errors.)
adb shell cmd location providers add-test-provider gps

# Enable GPS test provider
adb shell cmd location providers set-test-provider-enabled gps true

# Set location with time (time can't be earlier than the limit set by the lower bound.)
adb shell cmd location providers set-test-provider-location gps --location <LATITUDE>,<LONGITUDE> --time <TIME>

Suggerimenti di orario esterno

I suggerimenti di orario esterni sono un altro modo per fornire suggerimenti automatici per gli orari Android. Queste nuove opzioni ti consentono di fornire ad Android suggerimenti di orario completamente personalizzati, che possono provenire da varie ECU che, a loro volta, possono utilizzare una combinazione di orologio in tempo reale, GNSS, NITZ o qualsiasi altra fonte dell'ora.

In Android 12 sono disponibili i seguenti suggerimenti da considerare come external suggerimenti di orario:

  • Proprietà VHAL. Un nuovo Proprietà VHAL denominato EPOCH_TIME. Questa proprietà indica il numero di millisecondi trascorsi dall'1/1/1970 UTC. Il suo valore può essere passato Android TimeManager per suggerire un nuovo orario di sistema. Un esempio di VHAL che aggiorna questa proprietà è fornita nella implementazione del riferimento di seguito.
  • API di sistema. Un nuovo metodo chiamato suggestExternalTime() è disponibile in TimeManager per fornire al sistema un suggerimento orario esterno. Se il sistema è configurato per prendere in considerazione i suggerimenti di orario esterni (utilizzando config_autoTimeSourcesPrioritynel file di configurazione), il timestamp a questo metodo viene utilizzato per impostare l'ora di sistema, se non sono presenti suggerimenti di data/ora priorità disponibili.

Puoi implementare una soluzione temporale esterna come descritto di seguito:

  1. Aggiorna il file di configurazione delle risorse (core/res/res/values/config.xml) e poi aggiungi il valore external a config_autoTimeSourcesPriority:
    <string-array name="config_autoTimeSourcesPriority>
            <item>external</item>
            <item>gnss</item>
    </string-array>

    In questo modo si indica ad Android di dare la massima priorità ai suggerimenti di orario esterni durante l'impostazione l'orologio di sistema. L'hardware sul veicolo scrive un suggerimento di timestamp per il nuovo EPOCH_TIME Proprietà VHAL:

  2. Un'app fornita dal fornitore legge questa proprietà e chiama TimeManager.suggestExternal(). Android può quindi utilizzare il timestamp fornito come nuovo valore dell'orologio di sistema.