Zeitquellenpriorität

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Das Android-Framework verwendet verschiedene Zeitquellen für die Zeitsynchronisierung. Diese Seite konzentriert sich auf die automatischen Zeitquellen Network Time Protocol (NTP) und Network Identity and Time Zone (NITZ). Standardmäßig priorisiert das Framework in Android 12 oder höher NTP als Zeitquelle gegenüber NITZ, da NTP genauer und zuverlässiger als NITZ ist. In Situationen, in denen NTP nicht verfügbar ist, greift das Framework auf NITZ zurück. Dies ist eine Umkehrung der Standardpriorität früherer Versionen der Plattform. Standardmäßig priorisiert das Framework in Android 11 und niedriger NITZ gegenüber NTP.

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

Priorität der Zeitquelle konfigurieren

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

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

  • Telefonie (NITZ)
  • Netzwerk (NTP)

Testen

Gehen Sie wie folgt vor, um zu überprüfen, ob das Gerät NITZ verwendet, wenn NTP nicht verfügbar ist (wenn mobile Daten und Wi-Fi deaktiviert sind):

  1. Stellen Sie sicher, dass sich eine funktionierende SIM-Karte im DUT 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 in der Zukunft manuell auf einen falschen Zeitwert ein
  6. Starte das Gerät neu
  7. Schalten Sie die automatische Zeiterkennung ein
  8. Nehmen Sie das Gerät aus dem Flugmodus

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

adb shell dumpsys time_detector

Um zu überprüfen, ob die Systemuhr NITZ verwendet, bestätigen Sie Folgendes in der Befehlsausgabe:

  • mEnvironment.isAutoTimeDetectionEnabled() ist true .
  • mEnvironment.autoOriginPriorities() enthält eine Liste von Zeitquellen, wobei Quellen weiter oben in der Liste Vorrang vor Quellen weiter unten in der Liste haben.
  • Der Abschnitt Time change log zeigt, dass die Systemuhr über einen Telefonievorschlag gestellt wird.
  • Der Abschnitt Telephony suggestion history enthält Zeitvorschläge.
  • Der Abschnitt Network suggestion history ist leer.

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

Der Abschnitt Time change log zeichnet die an der Systemuhr des Geräts vorgenommenen Änderungen und den verwendeten Vorschlag auf. Die Systemuhr wird basierend auf der Reihenfolge der Zeitquellen in der Prioritätsliste im Schlüssel config_autoTimeSourcesPriority . Vorschläge aus einer Quelle mit höherer Priorität werden jedoch möglicherweise ignoriert, wenn der Vorschlag zu alt oder ungültig ist. Auch wenn der gültige Vorschlag mit der höchsten Priorität innerhalb weniger Sekunden mit der aktuellen Systemuhrzeit des Geräts übereinstimmt, wird die Zeit nicht geändert. Solange die Vorschläge nicht veraltet sind, wird in diesem Testfall die Systemuhr mit einem der Vorschläge aus der Telephony suggestion history .

Das Folgende ist ein Beispiel für eine Ausgabe, bei der das Gerät auf die Verwendung von 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}

Zum Vergleich mit der Ausgabe im Testszenario ist im Folgenden ein Beispiel für eine typische Ausgabe aufgeführt, bei der das Gerät Zeitvorschläge sowohl von NTP- als auch von 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}