Rilevamento automatico del tempo

Il rilevamento automatico dell'ora riceve suggerimenti orari da varie fonti, seleziona l'opzione migliore e quindi imposta l'orologio di sistema in Android in modo che corrisponda. Le versioni precedenti di Android fornivano due modi per impostare la data e l'ora, impostandole manualmente per utente o tramite rilevamento automatico dell'ora e impostandole tramite una di queste opzioni:

  • telephony utilizza segnali di telefonia Network Identity and Time Zone (NITZ).
  • network utilizza server di riferimento temporale NTP (Network Time Protocol).

Ciascuna opzione richiede connessioni a reti esterne, che non sono sempre disponibili in Android Automotive. Ad esempio, in alcuni paesi, alcune automobili potrebbero non essere dotate di telefonia integrata. Pertanto, l'ora GNSS (Global Satellite Navigation Systems) viene fornita come fonte dell'ora di sistema da utilizzare quando la connettività di rete non è disponibile.

Questa prossima versione di Android fornisce altre due opzioni per rilevare e impostare automaticamente l'ora:

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

Abilita il rilevamento automatico dell'ora

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

Figura 1. Selezionare Data e ora automatiche

Configurare le origini orarie

Per specificare quali fonti orarie includere nel rilevamento automatico dell'ora e la priorità con cui considerare tali fonti orarie, è necessario modificare il file di configurazione delle risorse del dispositivo, 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 vengono considerate nel rilevamento automatico dell'orario e i suggerimenti sull'orario telephony hanno la priorità rispetto ai suggerimenti sull'orario network .

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

Limite temporale inferiore

Android 12 fornisce un nuovo limite temporale inferiore da utilizzare durante la convalida dei suggerimenti temporali. Prima di questa funzionalità, il rilevamento automatico dell'ora non convalidava l'ora UTC in entrata suggerita. Con questa funzione, i tempi che trascorrono prima del limite inferiore vengono scartati.

Il valore del limite inferiore è determinato da una data derivata dal timestamp della build. Funziona in base al principio che non può verificarsi un tempo valido prima della creazione dell'immagine del sistema. Android non impone un limite superiore.

Suggerimenti orari GNSS

La fonte dell'ora gnss è una novità di Android 12 ed è fornita dai segnali GPS. Si tratta di una fonte affidabile per l'orario in cui telephony e network non sono disponibili. Questa opzione viene aggiunta al nuovo GnssTimeUpdateService in SystemServer che ascolta passivamente gli aggiornamenti della posizione. Quando viene ricevuta una posizione valida, GnssTimeUpdateService invia un suggerimento a TimeDetectorService , che quindi determina se l'orologio di sistema deve essere aggiornato.

Per impostazione predefinita, l'origine dell'ora gnss non è abilitata in AOSP e, pertanto, deve essere abilitata 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 abilitare questa funzione:

  1. Aggiorna config_enableGnssTimeUpdateService . Il valore per config_enableGnssTimeUpdateService deve essere impostato su true .
  2. Aggiorna config_autoTimeSourcesPriority . gnss deve essere aggiunto all'elenco di elementi per config_autoTimeSourcesPriority . La posizione del gnss nell'elenco delle priorità determina la priorità data ai suggerimenti GNSS, rispetto ai valori provenienti da altre fonti.

Impatto sul potere

GnssTimeUpdateService ascolta passivamente gli aggiornamenti sulla posizione, il che significa che non accende mai attivamente il GPS per consumare ulteriore energia. Di conseguenza, la potenza consumata quando la sorgente GNSS è abilitata è trascurabile. Ciò significa anche che, a meno che un'altra app o servizio nel sistema non richieda attivamente aggiornamenti di posizione, GnssTimeUpdateService non riceve un aggiornamento di posizione e non suggerisce un'ora GNSS.

Test

Suite di test di compatibilità (CTS)

Viene fornito un test CTS per verificare che sia disponibile l'ora fornita dal GNSS. Per i dettagli, vedere LocationShellCommand.java .

Test unitari

Vedere i test unitari di base nel seguente file:

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

Prove manuali

Per testare questa funzionalità, sono stati aggiunti nuovi comandi a LocationShellCommand.java . Utilizza questi comandi per aggiungere fornitori di test con cui puoi specificare una posizione e l'ora GNSS associata. GnssTimeUpdateService ascolta questi aggiornamenti di posizione e periodicamente fornisce suggerimenti.

Nota: l'interfaccia per questi comandi potrebbe cambiare tra una versione e l'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 temporali esterni

I suggerimenti orari esterni sono un altro modo per fornire suggerimenti orari automatici ad Android. Queste nuove opzioni consentono di fornire suggerimenti orari completamente personalizzati ad Android, 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 temporale.

I seguenti suggerimenti sono disponibili in Android 12 da considerare come suggerimenti orari external :

  • Proprietà VHAL. Viene fornita una nuova proprietà VHAL denominata EPOCH_TIME . Questa proprietà indica il numero di millisecondi trascorsi dal 1/1/1970 UTC. Il suo valore può essere passato ad Android TimeManager per suggerire una nuova ora di sistema. Un'implementazione VHAL di esempio che aggiorna questa proprietà è fornita nell'implementazione di riferimento seguente.
  • API di sistema. Un nuovo metodo chiamato suggestExternalTime() è disponibile in TimeManager per fornire al sistema un suggerimento temporale esterno. Se il sistema è configurato per prendere in considerazione suggerimenti orari esterni (utilizzando config_autoTimeSourcesPriority nel file di configurazione), il timestamp passato a questo metodo viene utilizzato per impostare l'orario del sistema, se non sono disponibili suggerimenti orari con priorità più elevata.

È possibile implementare una soluzione temporale esterna come descritto di seguito:

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

    In questo modo Android assegna ai suggerimenti orari esterni la massima priorità durante l'impostazione dell'orologio di sistema. L'hardware sul veicolo scrive un suggerimento di timestamp nella nuova proprietà EPOCH_TIME 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.