Android-Geräte versuchen automatisch, die richtige Unix-Epochenzeit von einer Netzwerkquelle abzurufen. Android verwendet das SNTP-Protokoll, das das UDP-Protokoll verwendet, um Zeitinformationen abzurufen.
Die auf dieser Seite beschriebenen Komponenten sind Teil des Systems zur automatischen Zeiterkennung, das als Netzwerkzeitursprung bezeichnet wird. Die Systemuhr eines Android-Geräts kann anhand eines Zeitsignals von einem Netzwerkzeitserver eingestellt werden, wenn die automatische Zeiterkennung auf dem Gerät unterstützt wird und der time_detector
-Dienst für die Verwendung konfiguriert ist.
Standardmäßig verwendet Android die Netzwerkzeit als primären Ursprung für die automatische Zeiterkennung.
System zur Netzwerkzeiterkennung
Der Dienst network_time_update_service
, der auf dem Android-Systemserver ausgeführt wird, implementiert das Netzwerkzeiterkennungssystem. Der Dienst verwendet regelmäßig SNTP, um ein Zeitsignal von einem Server abzurufen. Der Dienst überwacht auch die Netzwerkverbindung und löst eine Zeitaktualisierung aus, wenn nach längeren Zeiträumen mit schlechter Verbindung kein aktuelles Zeitsignal verfügbar ist.
Der network_time_update_service
-Dienst versucht, nach dem Start und wenn die Netzwerkverbindung zum ersten Mal hergestellt wird, ein Zeitsignal zu erhalten. Der Dienst versucht dann, das aktuelle Signal auf dem neuesten Stand zu halten. Dadurch werden die Anforderungen einzelner Android-Geräte gegen die erhebliche Belastung ausgewogen, die von vielen Android-Geräten weltweit generiert werden könnte, um ihre Zeit zu aktualisieren.
Mithilfe interner APIs sendet network_time_update_service
Vorschläge für die Netzwerkzeit an den Dienst time_detector
. Andere Komponenten der Android-Plattform verwenden dann diese Netzwerkzeitvorschläge.
Nachdem der time_detector
-Dienst Vorschläge vom Netzwerkzeitursprung erhalten hat, bestimmt er, ob die Systemuhr gemäß den konfigurierten Priorisierungsregeln aktualisiert werden soll.
Wenn Sie das System zur automatischen Zeiterkennung so konfigurieren möchten, dass die Systemuhr automatisch anhand der Vorschläge für den Netzwerkursprung eingestellt wird, verwenden Sie die Konfigurationsdatei des core/res/res/values/config.xml
-Systemservers. Der Wert network
muss an der gewünschten Position in config_autoTimeSourcesPriority
enthalten sein. Weitere Informationen finden Sie unter Priorität der Zeitquelle.
Gerätekonfiguration
In diesem Abschnitt wird beschrieben, wie Gerätehersteller das System zur Netzwerkzeiterkennung konfigurieren können.
Die AOSP-Basiskonfiguration befindet sich unter frameworks/base/core/res/res/values/config.xml
:
Konfigurationsschlüssel | AOSP-Wert | Beschreibung |
---|---|---|
config_ntpRetry |
3 |
Dies ist die Anzahl der Wiederholungen, mit denen das System nach einem fehlgeschlagenen Aktualisierungsversuch die Netzwerkzeit mit einem kürzeren NTP-Abfrageintervall (config_ntpPollingIntervalShorter ) abfragt, bevor es zum normalen Abfrageintervall (config_ntpPollingInterval ) zurückkehrt. Bei einem Wert unter 0 wiederholt das System die Abfrage mit dem kürzeren NTP-Abfrageintervall, bis die Aktualisierung erfolgreich abgeschlossen werden kann. |
config_ntpPollingInterval |
64800000 (18 Stunden) |
Das normale Polling-Intervall für die Netzwerkzeit in Millisekunden. |
config_ntpPollingIntervalShorter |
60000 (1 Minute) |
Das Zeitintervall für die Netzwerkwiederholung in Millisekunden. Wird verwendet, wenn eine Zeitaktualisierung fehlschlägt. |
config_ntpServers |
Ein einzelner Eintrag: ntp://time.android.com |
NTP-Server, die zur Ermittlung einer genauen Zeit verwendet werden sollen. Elemente müssen das Format ntp://<host>[:port] haben.
Das ist kein registriertes IANA-URI-Schema. |
config_ntpTimeout |
5.000 | Zeit in Millisekunden, die auf eine NTP-Serverantwort gewartet wird, bevor die Zeitüberschreitung eintritt. |
Server
Standardmäßig verwendet AOSP Zeitserver unter time.android.com
, einem Alias für Google Public NTP. Für diesen Dienst gibt es kein SLA. Weitere Informationen finden Sie unter Google Public NTP – FAQs.
Unterstützung mehrerer Server
Ab Android 14 unterstützt das Framework mehrere NTP-Server. Dies ist hilfreich, wenn Geräte weltweit mit einer einzigen Konfiguration bereitgestellt werden, der Zugriff auf Server wie time.android.com
aber an bestimmten Orten eingeschränkt ist.
Der Algorithmus versucht, jeden im Konfigurationsschlüssel config_ntpServers
angegebenen Server zu verwenden. Wenn ein Server gefunden wird, der antwortet, verwendet das System diesen Server so lange, bis die Aktualisierung fehlschlägt oder das Gerät neu gestartet wird.
Genauigkeit
Bei der standardmäßigen Netzwerkzeitsynchronisierung von Android wird SNTP mit einer einmaligen Abfrage pro Tag verwendet, um sicherzustellen, dass immer ein aktuelles Zeitsignal vorliegt.
Netzwerklatenzeffekte tragen hauptsächlich zur Zeitungenauigkeit bei der SNTP-Implementierung von Android bei. SNTP geht von symmetrischen Netzwerkverzögerungen aus. Das bedeutet, dass die Netzwerklatenz für die Anfrage der Netzwerklatenz für die Antwort entspricht und die korrekte Zeit genau in der Mitte des Netzwerkumlaufs liegt. Die Netzwerk-Umlaufzeit liegt oft im Bereich von einigen hundert Millisekunden und in einem drahtgebundenen Netzwerk ist die Latenz nahezu symmetrisch, was zu Ungenauigkeiten führt, die für Nutzer kaum wahrnehmbar sind. Bei der Mobilfunk- oder Funktelefonie gibt es jedoch mehrere Phasen, in denen relativ lange, asymmetrische Verzögerungen in eine Netzwerktransaktion eingefügt werden können, was zu größeren Abweichungen führt.
Wenn die AOSP-Standardeinstellung für config_ntpTimeout
auf 5000
Millisekunden festgelegt ist und sich die gesamte Netzwerklatenz nur auf den ein- oder ausgehenden Pfad konzentriert, beträgt der maximale theoretische Fehler etwa 2, 5 Sekunden.
Die Gesamtgenauigkeit der Systemuhr hängt auch davon ab, ob das Android-Gerät die verstrichene Zeit nach Erhalt eines Zeitsignals genau erfassen kann. Das ist nicht nur bei der Netzwerkzeiterkennung, sondern bei der gesamten Zeitmessung auf Android-Geräten ein Problem. Deshalb werden alte Zeitvorschläge vom time_detector
-Dienst ignoriert. Der network_time_update_service
-Dienst wird regelmäßig unter Verwendung des config_ntpPollingInterval
-Intervalls aktualisiert, damit der time_detector
-Dienst immer mit aktuellen Zeitvorschlägen bereitgestellt wird und der time_detector
-Dienst nicht auf eine niedrigere Priorität und oft eine geringere Genauigkeit oder gelegentlich falsche Zeitquellen wie telephony
zurückgreift.
Wenn die automatische Zeiterkennung verwendet wird, kann sich die Genauigkeit der Systemuhr des Geräts durch andere Konfigurationen des time_detector
-Dienstes beeinflussen lassen, z. B. durch Konstanten und Flags, die sich darauf auswirken, wie stark sich ein Zeitvorschlag von der aktuellen Systemuhrzeit unterscheiden muss, bevor die Uhr angepasst wird (ServiceConfigAccessorImpl.java
).
Gerätehersteller können die Genauigkeit mithilfe der oben genannten Konfigurationsoptionen und Konstanten ändern. Es ist jedoch wichtig, sich der Einschränkungen der SNTP-Implementierung der Plattform und der potenziellen Auswirkungen auf den Energieverbrauch durch häufigere Netzwerkvorgänge, der Auswirkungen auf auf dem Gerät ausgeführte Apps durch häufigere, aber kleinere Zeitkorrekturen und der Auswirkungen auf die Serverlast bewusst zu sein.
Andere Verwendungen der Netzwerkzeit
Wenn die automatische Zeiterkennung mit dem network
-Ursprung nicht konfiguriert ist oder der Nutzer die automatische Zeiterkennung deaktiviert hat, wird die vom network_time_update_service
-Dienst abgerufene Zeit weiterhin von den folgenden Komponenten verwendet:
- Die Methode
SystemClock.currentNetworkTimeClock()
. - Interne Plattformfunktionen. So kann A-GPS beispielsweise eine GNSS-Fixierung (Standort) schneller vornehmen, wenn es Informationen zur Netzwerkzeit hat.
Debugging und Tests
Im folgenden Abschnitt werden Shell-Befehle zum Debuggen und Testen der Funktion zur Erkennung der Netzwerkzeit beschrieben.
Mit dem Dienst „network_time_update_service“ interagieren
So rufen Sie den aktuellen Status von network_time_update_service
ab:
adb shell cmd network_time_update_service dump
Um eine Reihe von Befehlszeilenoptionen anzuzeigen, die beim Testen helfen können, verwenden Sie:
adb shell cmd network_time_update_service help