Android-Geräte versuchen automatisch, die korrekte Unix-Epochenzeit von einer Netzwerkquelle zu erhalten. Android verwendet das SNTP-Protokoll, das das UDP-Protokoll verwendet, um Zeitinformationen zu erhalten.
Die auf dieser Seite beschriebenen Komponenten sind Teil des automatischen Zeiterkennungssystems, das als Netzwerkzeitursprung bezeichnet wird. Ein Zeitsignal von einem Netzwerkzeitserver kann zum Einstellen der Systemuhr des Android-Geräts verwendet werden, wenn die automatische Zeiterkennung auf dem Gerät unterstützt wird und der Dienst time_detector
für die Verwendung dieser Funktion konfiguriert ist.
Standardmäßig verwendet Android den Netzwerkzeitursprung als primären Ursprungsort für die automatische Zeiterkennung.
Netzwerkzeiterkennungssystem
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 zu erhalten. Der Dienst überwacht außerdem die Netzwerkkonnektivität und löst eine Zeitaktualisierung aus, wenn nach längeren Zeiträumen mit schlechter Konnektivität kein aktuelles Zeitsignal verfügbar ist.
Der Dienst network_time_update_service
versucht, nach dem Booten und beim ersten Aufbau der Netzwerkverbindung ein Zeitsignal zu erhalten. Der Dienst versucht dann, das neueste Signal, das er besitzt, aktuell zu halten. Es gleicht die Bedürfnisse einzelner Android-Geräte mit der erheblichen Last aus, die durch die Auffrischung vieler Android-Geräte weltweit entstehen könnte.
Mithilfe interner APIs sendet network_time_update_service
Netzwerkzeitvorschläge an den time_detector
Dienst. Andere Android-Plattformkomponenten verwenden dann diese Netzwerkzeitvorschläge.
Nachdem er Vorschläge vom Netzwerkzeitursprung erhalten hat, bestimmt der time_detector
Dienst, ob die Systemuhr gemäß den konfigurierten Priorisierungsregeln aktualisiert werden soll.
Um das automatische Zeiterkennungssystem so zu konfigurieren, dass es die Netzwerkursprungsvorschläge zum automatischen Einstellen der Systemuhr verwendet, verwenden Sie die Systemserver-Konfigurationsdatei core/res/res/values/config.xml
. Stellen Sie sicher, dass das network
in config_autoTimeSourcesPriority
an der gewünschten Position enthalten ist. Einzelheiten finden Sie unter Zeitquellenpriorität .
Gerätekonfiguration
In diesem Abschnitt wird beschrieben, wie Gerätehersteller das Netzwerkzeiterkennungssystem konfigurieren können.
Die Basis-AOSP-Konfiguration befindet sich unter frameworks/base/core/res/res/values/config.xml
:
Konfigurationsschlüssel | AOSP-Wert | Beschreibung |
---|---|---|
config_ntpRetry | 3 | Nach einer fehlgeschlagenen Aktualisierung ist dies die Häufigkeit, mit der das System eine Netzwerkzeitabfrage mit einem kürzeren NTP-Abfrageintervall ( config_ntpPollingIntervalShorter ) versucht, bevor es einen Rückzieher macht und das normale Abfrageintervall ( config_ntpPollingInterval ) verwendet. Ein Wert kleiner als 0 bedeutet, dass das System die Abfrage im kürzeren NTP-Abfrageintervall wiederholt, bis die Aktualisierung erfolgreich durchgeführt werden kann. |
config_ntpPollingInterval | 64800000 (18 Stunden) | Das normale Netzwerkzeitabfrageintervall in Millisekunden. |
config_ntpPollingIntervalShorter | 60000 (1 Minute) | Das Zeitabfrageintervall für Wiederholungsversuche im Netzwerk in Millisekunden. Wird verwendet, wenn eine Zeitaktualisierung fehlschlägt. |
config_ntpServers | Ein einzelner Eintrag: ntp://time.android.com | NTP-Server zur Ermittlung einer genauen Uhrzeit. Elemente müssen das folgende Format haben: ntp://<host>[:port] .Dies ist kein registriertes IANA-URI-Schema. |
config_ntpTimeout | 5000 | Wartezeit auf eine NTP-Serverantwort in Millisekunden vor dem Timeout. |
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 häufig gestellten Fragen zu Google Public NTP .
Unterstützung mehrerer Server
Für Android 14 und höher unterstützt das Framework mehrere NTP-Server. Dies unterstützt Situationen, in denen 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 probiert jeden im Konfigurationsschlüssel config_ntpServers
angegebenen Server aus. Wenn es einen Server findet, der antwortet, verwendet das System diesen Server weiter, bis die Aktualisierung fehlschlägt oder das Gerät neu startet.
Genauigkeit
Die standardmäßige Netzwerkzeitsynchronisierung von Android verwendet SNTP mit einer einzigen Zeitabfrage etwa einmal am Tag, um sicherzustellen, dass immer ein aktuelles Zeitsignal vorhanden ist.
Netzwerklatenzeffekte tragen am meisten zur Zeitungenauigkeit bei der SNTP-Implementierung von Android bei. SNTP geht von symmetrischen Netzwerkverzögerungen aus, d. h. die Netzwerklatenz für die Anfrage ist dieselbe wie die Netzwerklatenz für die Antwort, und der richtige Zeitpunkt liegt genau in der Mitte dieses Netzwerk-Roundtrips. Die Netzwerk-Round-Trip-Zeit liegt oft in der Größenordnung von einigen hundert Millisekunden und in einem kabelgebundenen Netzwerk ist die Latenz nahezu symmetrisch, was zu Ungenauigkeiten führt, die für Benutzer kaum wahrnehmbar sind. Allerdings gibt es bei der Mobil- oder Funktelefonie mehrere Phasen, in denen relativ lange, asymmetrische Verzögerungen in eine Netzwerktransaktion eingefügt werden können, was zu größerer Ungenauigkeit führt.
Wenn die AOSP-Standardeinstellung für config_ntpTimeout
auf 5000
Millisekunden eingestellt ist und sich die gesamte Netzwerklatenz ausschließlich auf den eingehenden oder ausgehenden Abschnitt konzentriert, beträgt der maximale theoretische Fehler etwa 2,5 Sekunden.
Die Gesamtgenauigkeit der Systemuhr wird auch durch die Fähigkeit des Android-Geräts beeinflusst, die verstrichene Zeit genau zu verfolgen, nachdem ein Zeitsignal empfangen wurde. Dies ist ein Problem bei der gesamten Zeitmessung unter Android, nicht nur bei der Netzwerkzeiterkennung, und ist der Grund, warum der time_detector
Dienst alte Zeitvorschläge ignoriert. Der Dienst network_time_update_service
“ wird regelmäßig mithilfe des Intervalls config_ntpPollingInterval
“ aktualisiert, um den Dienst „ time_detector
“ mit aktuellen Zeitvorschlägen zu versorgen und um sicherzustellen, dass der Dienst time_detector
nicht auf Zeitquellen mit niedrigerer Priorität und oft geringerer Genauigkeit 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 beeinflussen, wie unterschiedlich ein Zeitvorschlag von der aktuellen Systemuhrzeit sein 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 Stromverbrauch durch häufigere Netzwerkvorgänge, der Auswirkungen auf auf dem Gerät ausgeführten Apps durch häufigere, aber kleinere Taktanpassungen und der Auswirkungen auf die Serverlast bewusst zu sein.
Andere Verwendungen der Netzwerkzeit
Wenn die automatische Zeiterkennung mithilfe des network
nicht konfiguriert ist oder der Benutzer die automatische Zeiterkennung deaktiviert hat, wird die vom Dienst network_time_update_service
erhaltene Zeit weiterhin von den folgenden Komponenten verwendet:
- Die
SystemClock.currentNetworkTimeClock()
-Methode. - Interne Plattformfunktionen. Beispielsweise kann A-GPS einen ersten GNSS-Standort (Standort) schneller lokalisieren, wenn es über Netzwerkzeitinformationen verfügt.
Debuggen und Testen
Im folgenden Abschnitt werden Shell-Befehle zum Debuggen und Testen der Netzwerkzeiterkennungsfunktion beschrieben.
Interagieren Sie mit dem Dienst network_time_update_service
Um den aktuellen Status von network_time_update_service
auszugeben, verwenden Sie:
adb shell cmd network_time_update_service dump
Um eine Reihe von Befehlszeilenoptionen anzuzeigen, die beim Testen hilfreich sein können, verwenden Sie Folgendes:
adb shell cmd network_time_update_service help