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:
- Aggiorna
config_enableGnssTimeUpdateService
. Il valore perconfig_enableGnssTimeUpdateService
deve essere impostato sutrue
. - Aggiorna
config_autoTimeSourcesPriority
.gnss
deve essere aggiunto all'elenco di elementi perconfig_autoTimeSourcesPriority
. La posizione delgnss
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 AndroidTimeManager
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 (utilizzandoconfig_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:
- Aggiorna il file di configurazione delle risorse (
core/res/res/values/config.xml
) e quindi aggiungi il valoreexternal
aconfig_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 . - 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.