Rilevamento dell'ora di rete

I dispositivi Android tentano automaticamente di ottenere l'ora dell'epoca Unix corretta 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 temporale della rete . È possibile utilizzare un segnale orario proveniente da un server temporale di rete 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 temporale della rete come origine primaria per il rilevamento automatico dell'ora.

Sistema di rilevamento del tempo di rete

Il servizio network_time_update_service eseguito nel server del 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 inoltre la connettività di rete e attiva un aggiornamento temporale quando non è disponibile alcun 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 per la prima volta la connettività di rete. Il servizio tenta quindi di mantenere aggiornato il segnale più recente. Bilancia le esigenze dei singoli dispositivi Android con il carico sostanziale che potrebbe essere generato da molti dispositivi Android in tutto il mondo rinfrescando il loro tempo.

Utilizzando le API interne, network_time_update_service invia suggerimenti sull'orario di rete al servizio time_detector . Altri componenti della piattaforma Android utilizzano quindi questi suggerimenti sull'orario di rete.

Dopo aver ricevuto suggerimenti dall'origine temporale della rete, il servizio time_detector determina se aggiornare l'orologio di sistema in base alle regole di 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, utilizzare il file di configurazione del server di sistema core/res/res/values/config.xml . Assicurarsi che la network di valori sia contenuta in config_autoTimeSourcesPriority nella posizione desiderata. Per i dettagli, vedere Priorità della sorgente temporale .

Configurazione del dispositivo

Questa sezione descrive come i produttori di dispositivi possono configurare il sistema di rilevamento dell'ora di rete.

La configurazione AOSP di base è in frameworks/base/core/res/res/values/config.xml :

Chiave di configurazione Valore AOSP Descrizione
config_ntpRetry 3 Dopo un errore di aggiornamento, questo è il numero di volte in cui il sistema tenta il polling temporale della rete con un intervallo di polling NTP più breve ( config_ntpPollingIntervalShorter ), prima di tornare indietro e utilizzare il normale intervallo di polling ( config_ntpPollingInterval ). Un valore inferiore a 0 indica che il sistema ritenta 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 temporale della rete in millisecondi.
config_ntpPollingIntervalShorter 60000 (1 minuto) L'intervallo tra i tentativi di polling della rete in millisecondi. Utilizzato quando un aggiornamento temporale non riesce.
config_ntpServers Una sola voce: ntp://time.android.com Server NTP da utilizzare per ottenere l'ora precisa. Gli elementi devono essere nel formato: ntp://<host>[:port] .
Questo non è uno schema URI IANA registrato.
config_ntpTimeout 5000 Tempo di attesa per una risposta del server NTP in millisecondi prima del timeout.

Server

Per impostazione predefinita, AOSP utilizza i time server su time.android.com , che è un alias per Google Public NTP . Questo servizio non ha SLA. Per maggiori dettagli, consulta le domande frequenti su NTP pubblico di Google .

Supporto di più server

Per Android 14 e versioni successive, il framework supporta più server NTP. Ciò supporta situazioni in cui i dispositivi sono distribuiti globalmente con un'unica 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 si riavvia.

Precisione

La sincronizzazione dell'ora di rete predefinita di Android utilizza SNTP con una singola query temporale circa una volta al giorno per cercare di garantire che abbia sempre un segnale orario recente.

Gli effetti della latenza di rete sono il principale fattore che contribuisce all'imprecisione temporale con l'implementazione SNTP di Android. SNTP presuppone ritardi di rete simmetrici, ovvero la latenza di rete per la richiesta è uguale alla latenza di rete per la risposta e l'ora corretta si trova esattamente a metà del viaggio di andata e ritorno della rete. Spesso, il tempo di andata e ritorno della rete è dell'ordine di poche centinaia di millisecondi e su una rete cablata la latenza è quasi simmetrica, portando a livelli di imprecisione quasi impercettibili per gli utenti. Tuttavia, con la telefonia mobile o radiofonica ci sono diverse fasi in cui ritardi relativamente lunghi e asimmetrici possono essere inseriti in una transazione di rete che portano a 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 del sistema è influenzata anche dalla capacità del dispositivo Android di monitorare accuratamente il tempo trascorso dopo aver ottenuto un segnale orario. Questo è un problema relativo a tutto il cronometraggio su Android, non solo al rilevamento dell'ora di rete, ed è il motivo per cui il servizio time_detector ignora i suggerimenti dei vecchi tempi. Il servizio network_time_update_service si aggiorna regolarmente utilizzando l'intervallo config_ntpPollingInterval per mantenere il servizio time_detector fornito con nuovi suggerimenti sull'orario e per garantire che il servizio time_detector non ricada su origini temporali con priorità inferiore e spesso con precisione inferiore o occasionalmente errate come telephony .

Quando viene utilizzato il rilevamento automatico dell'ora, la precisione dell'orologio del 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 temporale e l'ora corrente dell'orologio del sistema prima che l'orologio venga regolato ( ServiceConfigAccessorImpl.java ).

I produttori di dispositivi possono modificare la precisione utilizzando le opzioni e le costanti di configurazione precedenti. Ma è importante essere consapevoli dei limiti dell'implementazione SNTP della piattaforma e del potenziale impatto sul consumo energetico derivante da operazioni di rete più frequenti, dell'impatto sulle app in esecuzione sul dispositivo derivante da regolazioni dell'orologio più frequenti ma più piccole e dell'effetto sul carico del server.

Altri usi del tempo di rete

Se il rilevamento automatico dell'ora utilizzando l'origine network non è configurato o se l'utente ha disabilitato 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, A-GPS può individuare una prima posizione GNSS (posizione) più velocemente quando dispone di informazioni sull'ora della 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.

Interagisci con il servizio network_time_update_service

Per scaricare lo stato corrente di network_time_update_service , utilizzare:

adb shell cmd network_time_update_service dump

Per visualizzare una serie di opzioni della riga di comando che possono aiutare con i test, utilizzare:

adb shell cmd network_time_update_service help