Priorytet źródła czasu

Platforma Androida korzysta z różnych źródeł czasu do synchronizacji czasu. Ta strona zawiera informacje na temat protokołu Network Time Protocol (NTP) Automatyczne źródła czasu tożsamości sieci i strefy czasowej (NITZ). Domyślnie w Androidzie 12 lub nowszym platforma traktuje NTP jako źródło czasu, a nie NITZ, ponieważ NTP to bardziej dokładne i niezawodne niż NITZ. W sytuacjach, gdy karta NTP jest niedostępna, stosowana jest zasada NITZ. To cofnięcie domyślnego priorytetu z wcześniejszych wersji platformy. Domyślnie w Androidzie 11 i starszych wersjach platforma nadaje priorytet NITZ przez NTP.

Więcej informacji o tej zmianie znajdziesz w tych aktualizacjach AOSP: 1563678 1513323.

Skonfiguruj priorytet źródła czasu

Aby skonfigurować, które źródło czasu ma domyślnie priorytet na określonym urządzeniu z Androidem skonfiguruj wersję config_autoTimeSourcesPriority klucz w frameworks/base/core/res/res/values/config.xml w momencie kompilacji. Godzina sugestie ze źródła czasu, które jest wyżej na liście, mają pierwszeństwo nad źródłami znajdującymi się niżej na liście.

Źródła czasu Androida, które można skonfigurować, znajdziesz tutaj: TimeDetectorStrategy.java Domyślnie są skonfigurowane te źródła:

  • Telefonia (NITZ)
  • Sieć (NTP)

Testowanie

Aby sprawdzić, czy urządzenie używa NITZ, gdy NTP jest niedostępne (gdy mobilna transmisja danych i Wi-Fi są wyłączone), wykonaj te czynności:

  1. Sprawdź, czy w jednostce organizacyjnej DUT jest sprawna karta SIM
  2. Wyłącz mobilną transmisję danych i Wi-Fi
  3. Przełącz urządzenie w tryb samolotowy, aby upewnić się, że radio w sieci komórkowej jest wyłączone.
  4. Wyłączanie automatycznego wykrywania czasu
  5. Ustaw ręcznie nieprawidłowy czas w przyszłości
  6. Zrestartuj urządzenie
  7. Włączanie automatycznego wykrywania czasu
  8. Wyłącz tryb samolotowy

Te kroki powodują zmianę zegara systemowego natychmiast po NITZ jest odbierany sygnał. Aby sprawdzić, jak czas urządzenia jest ustawiony, uruchom to polecenie:

adb shell dumpsys time_detector

Aby sprawdzić, czy zegar systemowy używa NITZ, potwierdź to w poleceniu dane wyjściowe:

  • mEnvironment.isAutoTimeDetectionEnabled(): true.
  • mEnvironment.autoOriginPriorities() zawiera listę źródeł czasu a źródła znajdujące się wyżej na liście mają pierwszeństwo przed źródłami znajdującymi się niżej w rankingu. z listy.
  • Sekcja Time change log pokazuje, że zegar systemowy jest ustawiony przy użyciu sugestia dotycząca telefonii.
  • Sekcja Telephony suggestion history zawiera proponowane terminy.
  • Sekcja Network suggestion history jest pusta.

Sugerowane terminy w Telephony suggestion history i Sekcje Network suggestion history są uważane za źródło danych dla: obecnie się znajdujesz. Jeśli urządzenie jest połączone z internetem i ma kartę SIM, sugestie są generowane przy użyciu zarówno sieci NTP, jak i NITZ (telefoniczne). W tym przypadku testowym tylko sekcja Telephony suggestion history zawiera sugestie, ponieważ Protokół NTP jest wyłączony.

Sekcja Time change log rejestruje zmiany wprowadzone w ustawieniach zegara systemowego i użytej sugestii. Zegar systemowy jest ustawiony na podstawie kolejność źródeł czasu na liście priorytetów w argumencie klawisz config_autoTimeSourcesPriority. Sugestie pochodzące od źródło o wyższym priorytecie może zostać zignorowane, jeśli sugestia jest zbyt stara lub nieprawidłowa. Ponadto, jeśli prawidłowa sugestia o najwyższym priorytecie jest zgodna z obecną odpowiedzią na urządzeniu zegar systemowy nie zmieni się z dokładnością do kilku sekund. W tym przypadku, jeśli sugestie są aktualne, zegar systemowy jest ustawiana na podstawie jednej z sugestii z Telephony suggestion history.

Oto przykład danych wyjściowych, po których urządzenie wraca do pracy, używając NITZ, gdy NTP jest niedostępne.

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}

Dla porównania jako porównania z wynikami w scenariuszu testowania funkcja to przykład typowych danych wyjściowych, na których urządzenie otrzymuje sugestie dotyczące czasu ze źródeł czasu NTP i NITZ.

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}