Priorytet źródła czasu

Platforma Androida korzysta z różnych źródeł czasu do synchronizacji czasu. Ta strona dotyczy automatycznych źródeł czasu związanych z protokołem Network Time Protocol (NTP) oraz tożsamością sieciową i strefą czasową (NITZ). Domyślnie w Androidzie 12 lub nowszym platforma nadaje priorytet NTP jako źródło czasu zamiast NITZ, ponieważ jest bardziej dokładny i niezawodny 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 ma wyższy priorytet niż NTP.

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

Skonfiguruj priorytet źródła czasu

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

Źródła czasu Androida, które możesz 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 komórkowa 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 po otrzymaniu sygnału NITZ. Aby sprawdzić, jak czas urządzenia jest ustawiony, uruchom to polecenie:

adb shell dumpsys time_detector

Aby sprawdzić, czy zegar systemowy używa NITZ, sprawdź w danych wyjściowych polecenia te informacje:

  • Ustawienie opcji mEnvironment.isAutoTimeDetectionEnabled() to true.
  • mEnvironment.autoOriginPriorities() zawiera listę źródeł czasu, których źródła znajdują się wyżej na liście, i mają pierwszeństwo przed źródłami znajdującymi się niżej na liście.
  • Sekcja Time change log pokazuje, że zegar systemowy jest ustawiony przy użyciu sugestii dotyczącej połączeń telefonicznych.
  • Sekcja Telephony suggestion history zawiera proponowane terminy.
  • Sekcja Network suggestion history jest pusta.

Sugestie dotyczące czasu w sekcjach Telephony suggestion history i Network suggestion history są uważane za źródło danych dotyczących czasu. Jeśli urządzenie jest podłączone do internetu 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 zapisuje zmiany wprowadzone w zegarku systemowym urządzenia i użytą sugestię. Zegar systemowy jest ustawiany na podstawie kolejności źródeł czasu na liście priorytetów w klawiszu config_autoTimeSourcesPriority. Sugestie ze źródła o wyższym priorytecie mogą jednak zostać zignorowane, jeśli są zbyt stare lub nieprawidłowe. Poza tym, jeśli prawidłowa sugestia o najwyższym priorytecie pasuje do aktualnego zegara systemowego urządzenia z dokładnością do kilku sekund, czas się nie zmieni. W tym przypadku, o ile sugestie są aktualne, zegar systemowy jest ustawiany na podstawie jednej z sugestii Telephony suggestion history.

Poniżej znajdziesz przykład danych wyjściowych, po których urządzenie powróci do korzystania z 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}

Poniżej przedstawiamy przykład typowych danych wyjściowych, w przypadku których urządzenie otrzymuje sugestie dotyczące czasu ze źródeł czasu NTP i NITZ, stanowiące porównanie z wynikami w scenariuszu testowania.

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}