Netzwerkzeiterkennung

Android-Geräte versuchen automatisch, die korrekte Unix-Epochenzeit aus einer Netzwerkquelle abzurufen. Android verwendet das Simple Network Time Protocol (SNTP), das das User Datagram Protocol (UDP) verwendet, um Zeitinformationen abzurufen.

Die auf dieser Seite beschriebenen Komponenten sind Teil des automatischen Zeiterkennungssystems, das als Netzwerkzeitquelle bezeichnet wird. Ein Zeitsignal von einem Netzwerkzeitserver kann verwendet werden, um die Systemuhr des Android-Geräts einzustellen, wenn die automatische Zeiterkennung auf dem Gerät unterstützt wird und der Dienst time_detector so konfiguriert ist, dass er sie verwendet.

Standardmäßig verwendet Android die Netzwerkzeitquelle als primäre Quelle für die automatische Zeiterkennung.

System zur Erkennung der Netzwerkzeit

Der Dienst network_time_update_service, der auf dem Android-Systemserver ausgeführt wird, implementiert das System zur Erkennung der Netzwerkzeit. Der Dienst verwendet regelmäßig SNTP, um ein Zeitsignal von einem Server abzurufen. Außerdem überwacht der Dienst die Netzwerkverbindung und löst eine Zeitaktualisierung aus, wenn nach längeren Zeiträumen mit schlechter Verbindung kein aktuelles Zeitsignal verfügbar ist.

Der Dienst network_time_update_service versucht, nach dem Start und beim ersten Herstellen einer Netzwerkverbindung ein Zeitsignal abzurufen. Anschließend versucht der Dienst, das zuletzt empfangene Signal aktuell zu halten. Dabei werden die Anforderungen einzelner Android-Geräte mit der erheblichen Last in Einklang gebracht, die durch viele Android-Geräte weltweit entstehen könnte, wenn sie ihre Zeit aktualisieren.

Der Dienst network_time_update_service sendet Vorschläge für die Netzwerkzeit über interne APIs an den Dienst time_detector. Andere Android-Plattformkomponenten verwenden diese Vorschläge dann.

Nachdem der Dienst Vorschläge von der Netzwerkzeitquelle erhalten hat, bestimmt er anhand der konfigurierten Priorisierungsregeln, ob die Systemuhr aktualisiert werden soll.time_detector

Wenn Sie das automatische Zeiterkennungssystem so konfigurieren möchten, dass die Vorschläge der Netzwerkquelle verwendet werden, um die Systemuhr automatisch einzustellen, verwenden Sie die Systemserver-Konfigurationsdatei core/res/res/values/config.xml. Achten Sie darauf, dass der Wert network an der gewünschten Position in config_autoTimeSourcesPriority enthalten ist. Weitere Informationen finden Sie unter Priorität der Zeitquelle.

Gerätekonfiguration

In diesem Abschnitt wird beschrieben, wie Gerätehersteller das System zur Erkennung der Netzwerkzeit konfigurieren können.

Die AOSP-Basiskonfiguration befindet sich in der config.xml Datei: frameworks/base/core/res/res/values/config.xml:

Konfigurationsschlüssel AOSP-Wert Beschreibung
config_ntpRetry 3 Wenn die Aktualisierung fehlschlägt, versucht das System so oft, die Netzwerkzeit mit einem kürzeren NTP-Abfrageintervall (config_ntpPollingIntervalShorter) abzurufen, bevor es das normale Abfrageintervall (config_ntpPollingInterval) verwendet. Ein Wert unter 0 bedeutet, dass das System die Abfrage mit dem kürzeren NTP Abfrageintervall wiederholt, bis die Aktualisierung erfolgreich ist.
config_ntpPollingInterval 64800000 (18 Stunden) Das normale Abfrageintervall für die Netzwerkzeit in Millisekunden.
config_ntpPollingIntervalShorter 60000 (1 Minute) Das Abfrageintervall für die Netzwerkzeit bei Wiederholungen in Millisekunden. Wird verwendet, wenn eine Zeitaktualisierung fehlschlägt.
config_ntpServers Ein einzelner Eintrag: ntp://time.android.com NTP-Server, die verwendet werden, um eine genaue Zeit zu erhalten. Elemente müssen das Format haben: ntp://<host>[:port].
Dies ist kein registriertes IANA-URI-Schema.
config_ntpTimeout 5000 Zeit in Millisekunden, die auf eine Antwort des NTP-Servers gewartet wird, bevor ein Timeout auftritt.

Server

Standardmäßig verwendet AOSP Zeitserver unter time.android.com. Dies ist ein Alias für Google Public NTP. Für diesen Dienst gibt es kein SLA. Weitere Informationen finden Sie in den FAQs zu Google Public NTP.

Unterstützung mehrerer Server

Bei Android 14 und höher unterstützt das Framework mehrere NTP-Server. Dies ist hilfreich, wenn Geräte weltweit mit einer einzigen Konfiguration verteilt sind, der Zugriff auf Server wie time.android.com jedoch an bestimmten Orten eingeschränkt ist.

Der Algorithmus versucht, jeden Server zu verwenden, der im Konfigurationsschlüssel config_ntpServers angegeben ist. Wenn der Algorithmus einen Server findet, der antwortet, verwendet das System diesen Server weiter, bis die Aktualisierung fehlschlägt oder das Gerät neu gestartet wird.

Genauigkeit

Die Standard-Netzwerkzeitsynchronisierung von Android verwendet SNTP mit einer einzelnen Zeitabfrage etwa einmal pro Tag, sodass immer ein aktuelles Zeitsignal verfügbar ist.

Netzwerklatenzeffekte tragen erheblich zur Ungenauigkeit der Zeit bei der SNTP-Implementierung von Android bei. SNTP geht von symmetrischen Netzwerkverzögerungen aus. Das heißt, die Netzwerklatenz für die Anfrage ist dieselbe wie die Netzwerklatenz für die Antwort und die korrekte Zeit liegt genau in der Mitte dieser Netzwerk-Umlaufzeit. Oft liegt die Netzwerk-Umlaufzeit im Bereich von einigen Hundert Millisekunden und in einem kabelgebundenen Netzwerk ist die Latenz nahezu symmetrisch, was zu Ungenauigkeiten führt, die für Nutzer kaum wahrnehmbar sind. Bei 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 einer größeren Ungenauigkeit führt.

Wenn die AOSP-Standardeinstellung für config_ntpTimeout auf 5000 Millisekunden festgelegt ist und die gesamte Netzwerklatenz ausschließlich auf die eingehende oder ausgehende Verbindung konzentriert ist, beträgt der maximale theoretische Fehler etwa 2, 5 Sekunden.

Die Genauigkeit der Systemuhr wird auch dadurch beeinflusst, wie genau das Android-Gerät die verstrichene Zeit nach dem Abrufen eines Zeitsignals erfassen kann. Dies ist ein Problem bei der gesamten Zeitmessung auf Android, nicht nur bei der Erkennung der Netzwerkzeit. Daher ignoriert der Dienst time_detector alte Zeitvorschläge. Der Dienst network_time_update_service wird regelmäßig im Intervall config_ntpPollingInterval aktualisiert, um den Dienst time_detector mit aktuellen Zeitvorschlägen zu versorgen und zu verhindern, dass der Dienst time_detector auf Zeitquellen mit niedrigerer Priorität und oft geringerer Genauigkeit oder gelegentlich falschen Zeitquellen wie telephony zurückgreift.

Wenn die automatische Zeiterkennung verwendet wird, kann die Genauigkeit der Systemuhr des Geräts durch andere Konfigurationen des Dienstes time_detector beeinflusst werden, z. B. durch die Konstanten und Flags, die festlegen, wie stark ein Zeitvorschlag von der aktuellen Systemzeit abweichen muss, bevor die Uhr angepasst wird (ServiceConfigAccessorImpl.java).

Gerätehersteller können die Genauigkeit mit den oben genannten Konfigurationsoptionen und Konstanten ändern. Es ist jedoch wichtig, die Einschränkungen der SNTP-Implementierung der Plattform zu kennen und die potenziellen Auswirkungen auf den Stromverbrauch durch häufigere Netzwerkaktivitäten, die Auswirkungen auf Apps, die auf dem Gerät ausgeführt werden, durch häufigere, aber kleinere Uhrenanpassungen und die Auswirkungen auf die Serverlast zu berücksichtigen.

Andere Verwendungsmöglichkeiten der Netzwerkzeit

Wenn die automatische Zeiterkennung mit der network Quelle 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 SystemClock.currentNetworkTimeClock() Methode.
  • Interne Plattformfunktionen. Mit Netzwerkzeitinformationen kann A-GPS beispielsweise eine erste GNSS-Position (Global Navigation Satellite System) schneller ermitteln.

Fehlerbehebung 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

So rufen Sie eine Reihe von Befehlszeilenoptionen auf, die beim Testen helfen können:

adb shell cmd network_time_update_service help