Rilevamento automatico dell'ora

Rilevamento automatico dell'ora riceve suggerimenti di orario da varie fonti, seleziona l'opzione migliore e poi 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: impostazione manuale per utente o rilevamento automatico dell'ora, impostata da una di queste opzioni:

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

Ogni opzione richiede connessioni a reti esterne, che non sono sempre disponibili in Android Automotive. Ad esempio, in alcuni paesi, alcune auto potrebbero non avere la telefonia integrata. Pertanto, l'ora dei sistemi di navigazione satellitare globali (GNSS) viene fornita come fonte di orario di sistema da utilizzare quando la connettività di rete non è disponibile.

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

  • gnss utilizza i sistemi di navigazione satellitari globali (GNSS).
  • external utilizza una proprietà VHAL o l'API di sistema.

Attivare il rilevamento automatico dell'ora

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

Figura 1. Seleziona Data e ora automatiche

Configurare le fonti di orario

Per specificare le fonti di orario da includere nel rilevamento automatico dell'ora e la priorità con cui devono essere prese in considerazione, devi 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 presi in considerazione nel rilevamento automatico dell'ora e i suggerimenti di orario telephony hanno la priorità rispetto ai suggerimenti di orario network.

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

Limite inferiore dell'ora

Android 12 fornisce un nuovo limite inferiore dell'ora da utilizzare per la convalida dei suggerimenti di orario. Prima di questa funzionalità, il rilevamento automatico dell'ora non convalidava l'ora UTC in entrata suggerita. Con questa funzionalità, le ore che trascorrono prima del limite inferiore vengono eliminate.

Il valore del limite inferiore viene determinato da una data derivata dal timestamp della build. Questo funziona in base al principio che un'ora valida non può verificarsi prima della creazione dell'immagine di sistema. Android non applica un limite superiore.

Suggerimenti di orario GNSS

La fonte di orario gnss è una novità di Android 12 ed è fornita dai segnali GPS. Si tratta di una fonte affidabile per l'orario quando 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 determina se l'orologio di sistema deve essere aggiornato.

Per impostazione predefinita, la fonte di orario 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 attivare questa funzionalità:

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

Impatto sul consumo energetico

GnssTimeUpdateService ascolta passivamente gli aggiornamenti della posizione, il che significa che non attiva mai attivamente il GPS per consumare energia aggiuntiva. Di conseguenza, il consumo energetico quando la fonte GNSS è attiva è trascurabile. Ciò significa anche che, a meno che un'altra app o un altro servizio nel sistema non richieda attivamente aggiornamenti della posizione, GnssTimeUpdateService non riceve un aggiornamento della posizione e non suggerisce 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, consulta 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 a LocationShellCommand.java. Utilizza questi comandi per aggiungere fornitori di test con cui puoi specificare una posizione e l'orario GNSS associato. GnssTimeUpdateService ascolta questi aggiornamenti della posizione e invia periodicamente suggerimenti.

Nota: l'interfaccia di questi comandi potrebbe cambiare tra le release.

# 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 esterni

I suggerimenti di orario esterni sono un altro modo per fornire suggerimenti di orario automatici ad Android. Questa nuova opzione ti consente di fornire suggerimenti di orario completamente personalizzati ad Android, che possono provenire da varie ECU che, a loro volta, possono utilizzare una combinazione di un orologio in tempo reale, GNSS, NITZ o qualsiasi altra fonte di orario.

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

  • Proprietà VHAL. Viene fornita una nuova proprietà VHAL denominata EPOCH_TIME. Questa proprietà indica il numero di millisecondi trascorsi dal 01/01/1970 UTC. Il suo valore può essere passato a Android TimeManager per suggerire un nuovo orario di sistema. Nella pagina di implementazione di riferimento è disponibile un'implementazione VHAL di esempio che aggiorna questa proprietà.
  • API di sistema. In TimeManager è disponibile un nuovo metodo chiamato suggestExternalTime() per fornire al sistema un suggerimento di orario esterno. Se il sistema è configurato per tenere conto dei suggerimenti di orario esterni (utilizzando config_autoTimeSourcesPriority nel file di configurazione), il timestamp passato a questo metodo viene utilizzato per impostare l'orario di sistema, se non sono disponibili suggerimenti di orario con priorità più alta.

Puoi implementare una soluzione di orario esterno 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, Android assegna la priorità più alta ai suggerimenti di orario esterni quando imposta l'orologio di sistema. L'hardware del veicolo scrive un suggerimento di timestamp nella nuova 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.