Priorytet źródła czasu

Platforma Androida używa różnych źródeł czasu do synchronizacji czasu. Na tej stronie skupimy się na automatycznych źródłach czasu, czyli protokole czasu sieciowego (NTP) oraz sieciowej tożsamości i strefie czasowej (NITZ). W Androidzie 12 lub nowszym platforma domyślnie traktuje NTP jako źródło czasu o wyższym priorytecie niż NITZ, ponieważ NTP jest dokładniejszy i bardziej niezawodny niż NITZ. W sytuacjach, w których NTP nie jest dostępny, platforma korzysta z NITZ. Jest to odwrócenie domyślnego priorytetu z wcześniejszych wersji platformy. W Androidzie 11 i starszych wersjach platforma domyślnie nadaje priorytet NITZ przed NTP.

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

Konfigurowanie priorytetu źródła czasu

Aby skonfigurować, które źródło czasu ma domyślnie wyższy priorytet w przypadku konkretnej wersji Androida, skonfiguruj klucz config_autoTimeSourcesPriorityframeworks/base/core/res/res/values/config.xml podczas kompilacji. Sugestie dotyczące czasu pochodzące ze źródła czasu, które znajduje się wyżej na liście, mają pierwszeństwo przed źródłami znajdującymi się niżej na liście.

Konfigurowalne źródła czasu Androida znajdziesz w TimeDetectorStrategy.java. Domyślnie skonfigurowane są te źródła:

  • Połączenia telefoniczne (NITZ)
  • Sieć (NTP)

Testowanie

Aby sprawdzić, czy urządzenie korzysta z NITZ, gdy NTP jest niedostępny (gdy mobilna transmisja danych i Wi-Fi są wyłączone):

  1. Sprawdź, czy w urządzeniu znajduje się działająca karta SIM.
  2. Wyłączanie mobilnej transmisji danych i Wi-Fi
  3. Włącz na urządzeniu tryb samolotowy, aby wyłączyć radio komórkowe.
  4. Wyłączanie automatycznego wykrywania czasu
  5. Ręcznie ustaw nieprawidłową godzinę w przyszłości.
  6. Uruchom ponownie urządzenie
  7. Włączanie automatycznego wykrywania czasu
  8. Wyłącz tryb samolotowy na urządzeniu.

Te czynności powodują zmianę zegara systemowego natychmiast po odebraniu sygnału NITZ. Aby sprawdzić, jak ustawiony jest czas na urządzeniu, uruchom to polecenie:

adb shell dumpsys time_detector

Aby sprawdzić, czy zegar systemowy korzysta z NITZ, w danych wyjściowych polecenia sprawdź te informacje:

  • Obecny stan „mEnvironment.isAutoTimeDetectionEnabled()”: true.
  • mEnvironment.autoOriginPriorities() zawiera listę źródeł czasu. Źródła znajdujące się wyżej na liście mają wyższy priorytet niż źródła znajdujące się niżej.
  • Sekcja Time change log pokazuje, że zegar systemowy jest ustawiony na podstawie sugestii dotyczącej telefonii.
  • Sekcja Telephony suggestion history zawiera propozycje terminu.
  • Sekcja Network suggestion history jest pusta.

Sugerowane godziny w sekcjach Telephony suggestion history i Network suggestion history są uznawane za źródło informacji o czasie. Jeśli urządzenie jest połączone z internetem i ma kartę SIM, sugestie są generowane przy użyciu zarówno NTP (sieć), jak i NITZ (telefonia). W tym przypadku sugestie zawiera tylko sekcja Telephony suggestion history, ponieważ strona nowej karty jest wyłączona.

W sekcji Time change log zapisywane są zmiany wprowadzone w zegarze systemowym urządzenia oraz użyta sugestia. Zegar systemowy jest ustawiany na podstawie kolejności źródeł czasu na liście priorytetów w config_autoTimeSourcesPriority. Sugestie ze źródła o wyższym priorytecie mogą jednak zostać zignorowane, jeśli są zbyt stare lub nieprawidłowe. Jeśli ponadto sugestia o najwyższym priorytecie pasuje do bieżącego czasu zegara systemowego urządzenia z dokładnością do kilku sekund, czas nie zostanie zmieniony. W tym przypadku, o ile sugestie nie są nieaktualne, zegar systemowy jest ustawiany na podstawie jednej z sugestii z Telephony suggestion history.

Oto przykład danych wyjściowych, w których urządzenie wraca do korzystania z NITZ, gdy NTP jest niedostępny.

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}

Poniżej znajdziesz przykład typowych danych wyjściowych, w których urządzenie otrzymuje sugestie dotyczące czasu ze źródeł NTP i NITZ. Możesz go użyć jako punktu odniesienia do porównania z danymi wyjściowymi w scenariuszu testowym.

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}