I dispositivi Android tentano automaticamente di ottenere l'ora Unix corretta da una sorgente 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
denominato origine dell'ora di rete. Un segnale orario da un server
di sincronizzazione dell'ora 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 dell'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 un segnale orario recente dopo periodi prolungati di scarsa connettività.
Il servizio network_time_update_service
tenta di ottenere un segnale orario dopo l'avvio e quando viene stabilita la connettività di rete. Il servizio tenta quindi
di mantenere aggiornato l'ultimo segnale in suo possesso. Bilancia le esigenze dei singoli
dispositivi Android con il carico sostanziale 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
sull'orario di rete al servizio time_detector
. Altri componenti della piattaforma Android
quindi utilizza questi suggerimenti sull'ora di 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 assegnazione delle priorità configurate.
Per configurare il sistema di rilevamento automatico dell'ora in modo che utilizzi i suggerimenti sull'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, vedi Priorità dell'origine ora.
Configurazione dispositivo
Questa sezione descrive come i produttori di dispositivi possono configurare il sistema di rilevamento dell'ora 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 il mancato aggiornamento, questo è il numero di tentativi
di polling dell'ora di rete con un intervallo di polling NTP più breve
(config_ntpPollingIntervalShorter ), prima di eseguire il backoff e utilizzare
l'intervallo di polling normale (config_ntpPollingInterval ). Un valore
inferiore a 0 indica che il sistema riprova il polling all'intervallo di polling NTP più breve
finché non riesce ad aggiornarsi correttamente. |
config_ntpPollingInterval |
64800000 (18 ore) |
Il normale intervallo di polling dell'ora di rete in millisecondi. |
config_ntpPollingIntervalShorter |
60000 (1 minuto) |
L'intervallo di polling dell'ora di rete per i tentativi in millisecondi. Utilizzato quando un aggiornamento dell'ora non riesce. |
config_ntpServers |
Una singola voce: ntp://time.android.com |
Server NTP da utilizzare per ottenere un orario preciso. Gli elementi devono essere nel formato:
ntp://<host>[:port] .
Questo non è uno schema URI IANA registrato. |
config_ntpTimeout |
5000 | Tempo di attesa di una risposta da parte di un server NTP in millisecondi prima del timeout. |
Server
Per impostazione predefinita, AOSP utilizza i server di sincronizzazione dell'ora all'indirizzo time.android.com
, che è un alias di Google Public NTP. Questo servizio non ha 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. Ciò supporta le situazioni in cui i dispositivi vengono distribuiti
a livello globale con una singola configurazione, ma in cui l'accesso a server come
time.android.com
è limitato in determinati luoghi.
L'algoritmo prova ogni server specificato nella chiave di configurazione config_ntpServers
. Quando ne trova uno che risponde, il sistema continua a utilizzare
quel server finché non riesce ad aggiornarsi o il dispositivo non si riavvia.
Precisione
La sincronizzazione dell'ora di rete predefinita di Android utilizza SNTP con una singola query dell'ora circa una volta al giorno per cercare di garantire che il segnale orario sia sempre recente.
Gli effetti della latenza di rete sono il principale fattore di imprecisione dell'ora con l'implementazione SNTP di Android. SNTP presuppone ritardi di rete simmetrici, ovvero la latenza di rete per la richiesta è uguale a quella per la risposta e l'ora corretta si trova esattamente a metà del round trip di rete. Spesso, il tempo di andata e ritorno della rete è dell'ordine di qualche centinaio di millisecondi e su una rete cablata la latenza è quasi simmetrica, il che porta a livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radiofonica ci sono diverse fasi in cui possono essere inseriti ritardi asimmetrici relativamente lunghi in una transazione di rete, il che comporta una maggiore imprecisione.
Con l'impostazione predefinita AOSP per config_ntpTimeout
impostata su 5000
millisecondi e se tutta la latenza di rete è concentrata esclusivamente sulla tratta in entrata
o in uscita, 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 l'ottenimento di un segnale orario. Questo problema riguarda
tutta la gestione del tempo su Android, non solo il rilevamento dell'ora di rete, ed è
per questo motivo che il servizio time_detector
ignora i suggerimenti relativi all'ora precedente. Il servizio
network_time_update_service
viene aggiornato regolarmente utilizzando l'intervallo
config_ntpPollingInterval
per mantenere il servizio time_detector
fornito con suggerimenti di orario aggiornati e per garantire che il servizio time_detector
non torni a origini temporali a priorità inferiore e spesso a precisione inferiore o
occasionalmente errate, come telephony
.
Quando viene utilizzato il rilevamento automatico dell'ora, la precisione 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 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 dovuto a operazioni di rete più frequenti, sull'impatto sulle app in esecuzione sul dispositivo dovuto a regolazioni dell'orologio più frequenti ma più piccole 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ò localizzare più rapidamente la prima correzione di un GNSS (posizione) quando dispone di informazioni sull'ora di rete.
Debug e test
La sezione seguente descrive i comandi della shell per il debug e il test della funzionalità di rilevamento dell'ora di rete.
Interagire con il servizio network_time_update_service
Per scaricare lo 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 aiutarti con i test, utilizza:
adb shell cmd network_time_update_service help