Netzwerkzeiterkennung

Android-Geräte versuchen automatisch, die richtige Unix-Epochenzeit von einer Netzwerkquelle abzurufen. Android verwendet das SNTP-Protokoll, das das UDP-Protokoll nutzt, um Zeitinformationen abzurufen.

Die auf dieser Seite beschriebenen Komponenten sind Teil des Systems zur automatischen Zeiterkennung, das als Netzwerkzeitursprung 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 time_detector-Dienst für die Verwendung konfiguriert ist.

Standardmäßig verwendet Android den Ursprung der Netzwerkzeit als primären Ursprung 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. Der Dienst überwacht auch die Netzwerkverbindung und löst eine Zeitaktualisierung aus, wenn nach längeren Phasen mit schlechter Verbindung kein aktuelles Zeitsignal verfügbar ist.

Der network_time_update_service-Dienst versucht, nach dem Start und beim ersten Herstellen einer Netzwerkverbindung ein Zeitsignal zu empfangen. Der Dienst versucht dann, das letzte empfangene Signal auf dem neuesten Stand 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.

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

Nachdem der time_detector-Dienst Vorschläge vom Netzwerkzeitursprung erhalten hat, wird anhand der konfigurierten Priorisierungsregeln entschieden, ob die Systemuhr aktualisiert werden soll.

Wenn Sie das automatische System zur Erkennung der Zeitzone so konfigurieren möchten, dass die Vorschläge des Netzwerkursprungs verwendet werden, um die Systemuhr automatisch einzustellen, verwenden Sie die Systemserver-Konfigurationsdatei core/res/res/values/config.xml. Prüfen Sie, ob 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 unter frameworks/base/core/res/res/values/config.xml:

Konfigurationsschlüssel AOSP-Wert Beschreibung
config_ntpRetry 3 Nachdem die Aktualisierung fehlgeschlagen ist, gibt dieser Wert an, wie oft das System die Abfrage der Netzwerkzeit mit einem kürzeren NTP-Abfrageintervall (config_ntpPollingIntervalShorter) versucht, 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 Netzwerkzeit-Polling-Intervall in Millisekunden.
config_ntpPollingIntervalShorter 60000 (1 Minute) Das Intervall für das erneute Abrufen der Netzwerkzeit in Millisekunden. Wird verwendet, wenn eine Zeitaktualisierung fehlschlägt.
config_ntpServers Ein einzelner Eintrag: ntp://time.android.com NTP-Server, die verwendet werden sollen, um eine genaue Zeit zu erhalten. Die Elemente müssen das Format ntp://<host>[:port] haben.
Dies ist kein registriertes IANA-URI-Schema.
config_ntpTimeout 5.000 Zeit in Millisekunden, die auf eine NTP-Serverantwort gewartet wird, bevor ein Zeitlimit überschritten wird.

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 in den Google Public NTP-FAQs.

Unterstützung mehrerer Server

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

Der Algorithmus versucht es mit jedem Server, der im Konfigurationsschlüssel config_ntpServers angegeben ist. Wenn das System einen Server findet, der antwortet, verwendet es diesen Server so lange, bis die Aktualisierung fehlschlägt oder das Gerät neu gestartet wird.

 Genauigkeit

Die standardmäßige Netzwerksynchronisierung der Uhrzeit unter Android verwendet SNTP mit einer einzelnen Zeitabfrage etwa einmal täglich, um immer ein aktuelles Zeitsignal zu erhalten.

Die Auswirkungen der Netzwerklatenz sind der größte Faktor für Zeitungenauigkeiten bei der SNTP-Implementierung von Android. SNTP geht von symmetrischen Netzwerkverzögerungen aus. Das bedeutet, dass die Netzwerklatenz für die Anfrage dieselbe ist wie die Netzwerklatenz für die Antwort und die richtige Zeit genau in der Mitte dieses Netzwerk-Roundtrips liegt. Die Round-Trip-Zeit im Netzwerk liegt oft im Bereich von einigen Hundert Millisekunden. In einem kabelgebundenen Netzwerk ist die Latenz nahezu symmetrisch, was zu Ungenauigkeiten führt, die für Nutzer kaum wahrnehmbar sind. Bei der Mobil- 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 den eingehenden oder ausgehenden Teil 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 Empfang eines Zeitsignals erfassen kann. Das ist ein Problem bei der gesamten Zeitmessung auf Android, nicht nur bei der Erkennung der Netzwerkzeit. Aus diesem Grund ignoriert der time_detector-Dienst alte Zeitvorschläge. Der network_time_update_service-Dienst wird regelmäßig im config_ntpPollingInterval-Intervall aktualisiert, um den time_detector-Dienst mit aktuellen Zeitvorschlägen zu versorgen und dafür zu sorgen, dass der time_detector-Dienst nicht auf weniger wichtige und oft weniger genaue oder gelegentlich falsche Zeitquellen wie telephony zurückgreift.

Wenn die automatische Zeiterkennung verwendet wird, kann die Genauigkeit der Systemuhr des Geräts durch andere Konfigurationen des time_detector-Dienstes beeinträchtigt werden, z. B. durch die Konstanten und Flags, die festlegen, 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 anpassen. Es ist jedoch wichtig, sich der Einschränkungen der SNTP-Implementierung der Plattform und der potenziellen Auswirkungen auf den Stromverbrauch durch häufigere Netzwerkoperationen, der Auswirkungen auf Apps, die auf dem Gerät ausgeführt werden, durch häufigere, aber kleinere Uhreinstellungen und der Auswirkungen auf die Serverlast bewusst zu sein.

Andere Verwendungen der Netzwerkzeit

Wenn die automatische Zeiterkennung über den Ursprung network 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 A-GPS kann beispielsweise einen GNSS-Standort schneller ermitteln, 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 geben Sie den aktuellen Status von network_time_update_service aus:

adb shell cmd network_time_update_service dump

Wenn Sie eine Reihe von Befehlszeilenoptionen sehen möchten, die beim Testen helfen können, verwenden Sie:

adb shell cmd network_time_update_service help