Priorität der Zeitquelle

Das Android-Framework verwendet verschiedene Zeitquellen für die Zeitsynchronisierung. Auf dieser Seite geht es um die automatischen Zeitquellen Network Time Protocol (NTP) und Network Identity and Time Zone (NITZ). In Android 12 oder höher priorisiert das Framework standardmäßig NTP als Zeitquelle gegenüber NITZ, da NTP genauer und zuverlässiger als NITZ ist. Wenn NTP nicht verfügbar ist, greift das Framework auf NITZ zurück. Das ist eine Umkehrung der Standardpriorität aus früheren Versionen der Plattform. In Android 11 und niedriger priorisiert das Framework standardmäßig NITZ gegenüber NTP.

Weitere Informationen zu dieser Änderung finden Sie in den folgenden AOSP-Patches: 1563678, 1513323.

Priorität der Zeitquelle konfigurieren

Wenn Sie konfigurieren möchten, welche Zeitquelle für eine bestimmte Android Version standardmäßig Priorität hat, konfigurieren Sie den config_autoTimeSourcesPriority Schlüssel in frameworks/base/core/res/res/values/config.xml zur Build-Zeit. Zeitvorschläge aus der Zeitquelle, die in der Liste weiter oben steht, haben Vorrang vor Quellen, die weiter unten in der Liste stehen.

Konfigurierbare Android-Zeitquellen finden Sie in TimeDetectorStrategy.java. Die folgenden Quellen sind standardmäßig für die Verwendung konfiguriert:

  • Telefonie (NITZ)
  • Netzwerk (NTP)

Test

So prüfen Sie, ob das Gerät NITZ verwendet, wenn NTP nicht verfügbar ist (wenn mobile Daten und WLAN deaktiviert sind):

  1. Achten Sie darauf, dass sich im Testgerät eine funktionierende SIM-Karte befindet.
  2. Deaktivieren Sie mobile Daten und WLAN.
  3. Versetzen Sie das Gerät in den Flugmodus, um sicherzustellen, dass das Mobilfunkgerät ausgeschaltet ist.
  4. Deaktivieren Sie die automatische Zeiterkennung.
  5. Stellen Sie die Uhr manuell auf einen falschen Zeitpunkt in der Zukunft ein.
  6. Starten Sie das Gerät neu.
  7. Aktivieren Sie die automatische Zeiterkennung.
  8. Deaktivieren Sie den Flugmodus.

Diese Schritte führen zu einer Änderung der Systemuhr, sobald ein NITZ-Signal empfangen wird. Führen Sie den folgenden Befehl aus, um zu prüfen, wie die Gerätezeit eingestellt ist:

adb shell dumpsys time_detector

Prüfen Sie in der Befehlsausgabe, ob die Systemuhr NITZ verwendet:

  • mEnvironment.isAutoTimeDetectionEnabled() ist true.
  • mEnvironment.autoOriginPriorities() enthält eine Liste von Zeitquellen, wobei Quellen, die weiter oben in der Liste stehen, Vorrang vor Quellen haben, die weiter unten in der Liste stehen.
  • Im Abschnitt Time change log (Zeitänderungsprotokoll) wird angezeigt, dass die Systemuhr mit einem Telefonievorschlag eingestellt wurde.
  • Der Abschnitt Telephony suggestion history (Vorschlagsverlauf für Telefonie) enthält Zeitvorschläge.
  • Der Abschnitt Network suggestion history (Vorschlagsverlauf für Netzwerk) ist leer.

Die Zeitvorschläge in den Abschnitten Telephony suggestion history (Vorschlagsverlauf für Telefonie) und Network suggestion history (Vorschlagsverlauf für Netzwerk) gelten als die Quelle der Wahrheit für die Zeit. Wenn das Gerät mit dem Internet verbunden ist und eine SIM-Karte hat, werden Vorschläge sowohl mit NTP (Netzwerk) als auch mit NITZ (Telefonie) generiert. In diesem Testfall enthält nur der Abschnitt Telephony suggestion history (Vorschlagsverlauf für Telefonie) Vorschläge, da NTP deaktiviert ist.

Im Abschnitt Time change log (Zeitänderungsprotokoll) werden die Änderungen an der Systemuhr des Geräts und der verwendete Vorschlag aufgezeichnet. Die Systemuhr wird anhand der Reihenfolge der Zeitquellen in der Prioritätsliste im Schlüssel config_autoTimeSourcesPriority eingestellt. Vorschläge aus einer Quelle mit höherer Priorität werden jedoch möglicherweise ignoriert, wenn der Vorschlag zu alt oder ungültig ist. Wenn der gültige Vorschlag mit der höchsten Priorität mit der aktuellen Systemzeit des Geräts innerhalb weniger Sekunden übereinstimmt, wird die Zeit außerdem nicht geändert. In diesem Testfall wird die Systemuhr mit einem der Vorschläge aus Telephony suggestion history (Vorschlagsverlauf für Telefonie) eingestellt, solange die Vorschläge nicht veraltet sind.

Im Folgenden sehen Sie ein Beispiel für eine Ausgabe, bei der das Gerät auf NITZ zurückgreift, wenn NTP nicht verfügbar ist.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=73059
  mEnvironment.systemClockMillis()=1614186767818
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    {Empty}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}

Als Referenz für einen Vergleich mit der Ausgabe im Testszenario sehen Sie hier ein Beispiel für eine typische Ausgabe, bei der das Gerät Zeitvorschläge von NTP- und NITZ-Zeitquellen erhält.

TimeDetectorStrategy:
  mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
  mEnvironment.isAutoTimeDetectionEnabled()=true
  mEnvironment.elapsedRealtimeMillis()=302926
  mEnvironment.systemClockMillis()=1614186997685
  mEnvironment.systemClockUpdateThresholdMillis()=2000
  mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
  mEnvironment.autoOriginPriorities()=[network,telephony]
  Time change log:
    66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
  Telephony suggestion history:
    key idx: 0=0
    val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      Historic values=[
        0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
      ]
  Network suggestion history:
    0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
  Gnss suggestion history:
    {Empty}
  External suggestion history:
    {Empty}