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 denominato origine ora della 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 sul server del sistema Android
implementa il sistema di rilevamento dell'ora della 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 in che modo 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 il mancato aggiornamento, questo è il numero di volte in cui il sistema tenta di eseguire il polling con un intervallo di polling NTP più breve
(config_ntpPollingIntervalShorter ), prima di tornare indietro e utilizzare
l'intervallo di polling normale (config_ntpPollingInterval ). Un valore
minore di 0 indica che il sistema riesegue il polling a un intervallo di polling NTP più breve
fino a quando non riesce ad aggiornare 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 riesce. |
config_ntpServers |
Una singola voce: ntp://time.android.com |
Server NTP da utilizzare per ottenere un'ora precisa. Gli elementi devono avere il formato:
ntp://<host>[:port] .
Questo non è 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 alcuno 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 una che risponde, il sistema continua a utilizzare
il server finché non riesce a eseguire l'aggiornamento o fino al riavvio del dispositivo.
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 che si verifichino ritardi di rete simmetrici, ovvero che la latenza di rete per la richiesta sia la stessa della latenza di rete per la risposta e che l'ora corretta sia esattamente nel mezzo del round trip della rete. Spesso il tempo di round trip della rete è nell'ordine di qualche centinaio di millisecondi e su una rete cablata la latenza è quasi simmetrica, con livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radio ci sono diverse fasi in cui è possibile inserire ritardi relativamente lunghi e asimmetrici in una transazione di rete con una conseguente maggiore inesattezza.
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 dipende anche dalla capacità del dispositivo Android di rilevare accuratamente il tempo trascorso dopo aver ottenuto il segnale di un orario. Questo è un problema con tutto il rilevamento dell'ora su Android, non solo con il rilevamento dell'ora di rete, ed è per questo che 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 mantenere il servizio time_detector
fornito con suggerimenti di orario aggiornati e per garantire che il servizio time_detector
non torni a priorità inferiore e spesso a precisione inferiore o a volte origini temporali 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 conoscere i limiti dell'implementazione SNTP della piattaforma e il potenziale impatto sul consumo energetico dovuto a operazioni di rete più frequenti, l'impatto sulle app in esecuzione sul dispositivo da regolazioni più frequenti ma minori dell'orologio e l'effetto sul carico del server.
Altri utilizzi del tempo 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 di piattaforma interne. 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
, usa:
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