Priorytet źródła czasu

Platforma Androida używa różnych źródeł czasu do synchronizacji czasu. Ta strona jest poświęcona automatycznym źródłom czasu, takim jak Network Time Protocol (NTP) i Network Identity and Time Zone (NITZ). W Androidzie 12 i nowszych wersjach 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 domyślnie platforma 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 określonej 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.

Źródła czasu Androida, które można skonfigurować, 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. Upewnij się, że w DUT jest działająca karta SIM.
  2. Wyłączanie mobilnej transmisji danych i Wi-Fi
  3. Włącz na urządzeniu tryb samolotowy, aby upewnić się, że radio komórkowe jest wyłączone.
  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 wyniku polecenia sprawdź te informacje:

  • mEnvironment.isAutoTimeDetectionEnabled(): true.
  • mEnvironment.autoOriginPriorities() zawiera listę źródeł czasu, przy czym ź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 terminów.
  • Sekcja Network suggestion history jest pusta.

Propozycje czasu w sekcjach Telephony suggestion historyNetwork 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 na podstawie danych NTP (sieć) i NITZ (telefonia). W tym przypadku tylko sekcja Telephony suggestion history zawiera sugestie, 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 kluczu config_autoTimeSourcesPriority. Sugestie ze źródła o wyższym priorytecie mogą być jednak ignorowane, 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.

Poniżej znajdziesz 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}

Aby porównać dane wyjściowe w scenariuszu testowym, poniżej znajdziesz przykład typowych danych wyjściowych, w 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}