I dispositivi Android tentano automaticamente di ottenere il tempo di epoch di Unix corretto da una fonte di rete. Android utilizza il protocollo SNTP, che utilizza il protocollo UDP, per ottenere informazioni sull'ora.
I componenti descritti in questa pagina fanno parte del sistema di rilevamento automatico dell'ora, chiamato origine ora di rete. Un segnale orario di un server orario di rete può essere utilizzato per impostare l'orologio di sistema del dispositivo Android quando il rilevamento automatico dell'ora è supportato sul dispositivo e il servizio time_detector
è configurato per utilizzarlo.
Per impostazione predefinita, Android utilizza l'origine ora di rete come origine principale per il rilevamento automatico dell'ora.
Sistema di rilevamento dell'ora di rete
Il servizio network_time_update_service
in esecuzione nel server di sistema Android implementa il sistema di rilevamento dell'ora di rete. Il servizio utilizza periodicamente SNTP per ottenere un segnale orario da un server. Il servizio monitora anche la connettività di rete e attiva un aggiornamento dell'ora quando non è disponibile alcun segnale orario recente dopo periodi prolungati di scarsa connettività.
Il servizio network_time_update_service
tenta di ottenere un segnale di tempo
dopo l'avvio e quando viene stabilita per la prima volta la connettività di rete. Il servizio quindi cerca di mantenere aggiornato l'ultimo indicatore in suo possesso. Equilibra le esigenze dei singoli dispositivi Android con il carico considerevole che potrebbe essere generato da molti dispositivi Android in tutto il mondo che aggiornano l'ora.
Utilizzando le API interne, network_time_update_service
invia suggerimenti per l'ora della rete al servizio time_detector
. Altri componenti della piattaforma Android utilizzano poi questi suggerimenti relativi all'ora della rete.
Dopo aver ricevuto i suggerimenti dall'origine dell'ora di rete, il servizio time_detector
determina se aggiornare l'orologio di sistema in base alle
regole di definizione delle priorità configurate.
Per configurare il sistema di rilevamento automatico dell'ora in modo che utilizzi i suggerimenti per l'origine della rete per impostare automaticamente l'orologio di sistema, utilizza il file di configurazione del server di sistema core/res/res/values/config.xml
. Assicurati che il valore network
sia contenuto in config_autoTimeSourcesPriority
nella posizione desiderata. Per maggiori dettagli, consulta
Priorità dell'origine ora.
Configurazione dispositivo
Questa sezione descrive come i produttori di dispositivi possono configurare il sistema di rilevamento del tempo di rete.
La configurazione AOSP di base si trova in
frameworks/base/core/res/res/values/config.xml
:
Chiave di configurazione | Valore AOSP | Descrizione |
---|---|---|
config_ntpRetry |
3 |
Dopo un mancato aggiornamento, indica il numero di volte in cui il sistema tenta il polling del tempo di rete con un intervallo di polling NTP più breve (config_ntpPollingIntervalShorter ) prima di eseguire il backup e utilizzare l'intervallo di polling normale (config_ntpPollingInterval ). Un valore inferiore a 0 indica che il sistema riprova a eseguire il polling con l'intervallo di polling NTP più breve finché non riesce ad aggiornarsi correttamente. |
config_ntpPollingInterval |
64800000 (18 ore) |
L'intervallo di polling del tempo di rete normale in millisecondi. |
config_ntpPollingIntervalShorter |
60000 (1 minuto) |
L'intervallo di polling del tempo di rete per i tentativi successivi in millisecondi. Utilizzato quando un aggiornamento dell'ora non va a buon fine. |
config_ntpServers |
Una singola voce: ntp://time.android.com |
Server NTP da utilizzare per ottenere un'ora precisa. Gli elementi devono essere nel formato:
ntp://<host>[:port] .
Non si tratta di uno schema URI IANA registrato. |
config_ntpTimeout |
5000 | Tempo di attesa di una risposta del server NTP in millisecondi prima del timeout. |
Server
Per impostazione predefinita, AOSP utilizza i server di tempo all'indirizzo time.android.com
, che è un alias per
Google Public NTP. Questo servizio non ha alcun SLA. Per maggiori dettagli, consulta le Domande frequenti su Google Public NTP.
Supporto di più server
Per Android 14 e versioni successive, il framework supporta più server NTP. Questo supporta le situazioni in cui i dispositivi sono distribuiti a livello globale con una singola configurazione, ma l'accesso ai server come time.android.com
è limitato in alcuni luoghi.
L'algoritmo prova ogni server specificato nella config_ntpServers
chiave di configurazione. Quando ne trova uno che risponde, il sistema continua a utilizzare quel server finché non riesce ad aggiornarsi o il dispositivo non si riavvia.
Accuratezza
La sincronizzazione dell'ora di rete predefinita di Android utilizza SNTP con una singola query sull'ora circa una volta al giorno per cercare di garantire sempre un segnale orario recente.
Gli effetti della latenza della rete sono il fattore più importante che contribuisce all'inaccuratezza del tempo con l'implementazione SNTP di Android. SNTP presuppone ritardi di rete simmetrici, ovvero la latenza di rete per la richiesta è la stessa della latenza di rete per la risposta e l'ora corretta si trova esattamente al centro del percorso di andata e ritorno della rete. Spesso il tempo di round trip della rete è dell'ordine di qualche centinaio di millisecondi e su una rete cablata la latenza è quasi simmetrica, il che comporta livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radio esistono diverse fasi in cui possono essere inseriti ritardi asimmetrici relativamente lunghi in una transazione di rete che comportano una maggiore imprecisione.
Con l'impostazione predefinita AOSP per config_ntpTimeout
impostata su 5000
millisecondi,
e se tutta la latenza della rete è concentrata esclusivamente sul tratto inbound o outbound,
l'errore teorico massimo è di circa 2,5 secondi.
La precisione complessiva dell'orologio di sistema è influenzata anche dalla capacità del dispositivo Android di monitorare con precisione il tempo trascorso dopo aver ottenuto un segnale orario. Questo è un problema con tutto il rilevamento dell'ora su Android, non solo con il rilevamento dell'ora di rete, ed è il motivo per cui il servizio time_detector
ignora i vecchi suggerimenti sull'ora. Il servizio network_time_update_service
si aggiorna regolarmente utilizzando l'intervallo config_ntpPollingInterval
per fornire al servizio time_detector
suggerimenti orari aggiornati e per assicurarsi che il servizio time_detector
non torni a origini orarie di priorità inferiore e spesso meno precise o talvolta errate come telephony
.
Quando viene utilizzato il rilevamento automatico dell'ora, l'accuratezza dell'orologio di sistema del dispositivo può essere influenzata da altre configurazioni del servizio time_detector
, ad esempio le costanti e i flag che influiscono sulla differenza che deve esserci tra un suggerimento di orario e l'ora corrente dell'orologio di sistema prima che l'orologio venga regolato (ServiceConfigAccessorImpl.java
).
I produttori di dispositivi possono modificare l'accuratezza utilizzando le opzioni e le costanti di configurazione precedenti. Tuttavia, è importante essere consapevoli delle limitazioni dell'implementazione SNTP della piattaforma e del potenziale impatto sul consumo energetico derivante da operazioni di rete più frequenti, sull'impatto delle app in esecuzione sul dispositivo derivante da aggiustamenti dell'orologio più frequenti, ma più piccoli, e sull'effetto sul carico del server.
Altri utilizzi dell'ora di rete
Se il rilevamento automatico dell'ora utilizzando l'origine network
non è configurato o se
l'utente ha disattivato il rilevamento automatico dell'ora, l'ora ottenuta dal
servizio network_time_update_service
viene comunque utilizzata dai seguenti componenti:
- Il metodo
SystemClock.currentNetworkTimeClock()
. - Funzioni della piattaforma interna. Ad esempio, l'A-GPS può individuare più rapidamente una correzione GNSS (posizione) se dispone di informazioni sull'ora della rete.
Debug e test
La sezione seguente descrive i comandi shell per il debug e il test della funzionalità di rilevamento dell'ora di rete.
Interagire con il servizio network_time_update_service
Per eseguire il dump dello stato attuale di network_time_update_service
, utilizza:
adb shell cmd network_time_update_service dump
Per visualizzare un insieme di opzioni della riga di comando che possono essere utili per i test, utilizza:
adb shell cmd network_time_update_service help