Wykrywanie czasu sieci

Urządzenia z Androidem automatycznie próbują uzyskać prawidłowy czas epoki uniksowej ze źródła sieciowego. Android używa protokołu SNTP, który korzysta z protokołu UDP, do uzyskiwania informacji o czasie.

Komponenty opisane na tej stronie są częścią systemu automatycznego wykrywania czasu, zwanego źródłem czasu sieciowego. Sygnał czasu z serwera czasu w sieci może być używany do ustawiania zegara systemowego urządzenia z Androidem, gdy urządzenie obsługuje automatyczne wykrywanie czasu, a usługa time_detector jest skonfigurowana tak, aby z niego korzystać.

Domyślnie Android używa czasu sieci jako głównego źródła automatycznego wykrywania czasu.

System wykrywania czasu sieciowego

Usługa network_time_update_service działająca na serwerze systemu Android wdraża system wykrywania czasu sieciowego. Usługa okresowo używa protokołu SNTP, aby uzyskać sygnał czasu z serwera. Usługa monitoruje też łączność sieciową i odświeża czas, gdy po dłuższym okresie słabej łączności nie jest dostępny żaden aktualny sygnał czasu.

Usługa network_time_update_service próbuje uzyskać sygnał czasu po uruchomieniu i przy pierwszym nawiązaniu połączenia sieciowego. Usługa próbuje następnie utrzymać aktualność ostatniego sygnału. Równoważy potrzeby poszczególnych urządzeń z Androidem z dużym obciążeniem, które może być generowane przez wiele urządzeń z Androidem na całym świecie odświeżających czas.

Za pomocą wewnętrznych interfejsów API network_time_update_service przesyła sugestie dotyczące czasu sieci do usługi time_detector. Inne komponenty platformy Android korzystają następnie z tych sugestii dotyczących czasu sieciowego.

Po otrzymaniu sugestii od źródła czasu sieciowego usługa time_detector określa, czy zaktualizować zegar systemowy zgodnie ze skonfigurowanymi regułami priorytetyzacji.

Aby skonfigurować system automatycznego wykrywania czasu tak, aby korzystał z sugestii dotyczących pochodzenia sieciowego i automatycznie ustawiał zegar systemowy, użyj core/res/res/values/config.xmlpliku konfiguracyjnego serwera systemowego. Sprawdź, czy wartość network znajduje się w config_autoTimeSourcesPriority w odpowiednim miejscu. Więcej informacji znajdziesz w artykule Priorytet źródła czasu.

Konfiguracja urządzenia

W tej sekcji opisano, jak producenci urządzeń mogą skonfigurować system wykrywania czasu sieciowego.

Podstawowa konfiguracja AOSP znajduje się w tym miejscu:frameworks/base/core/res/res/values/config.xml

Klucz konfiguracji Wartość AOSP Opis
config_ntpRetry 3 Po nieudanej próbie odświeżenia system próbuje config_ntpPollingIntervalShorter razy odpytać czas sieciowy z krótszym interwałem odpytywania NTP (config_ntpPollingIntervalShorter), zanim wycofa się i użyje normalnego interwału odpytywania (config_ntpPollingInterval). Wartość mniejsza niż 0 oznacza, że system ponawia odpytywanie z krótszym interwałem odpytywania NTP, dopóki nie uda mu się odświeżyć czasu.
config_ntpPollingInterval 64800000 (18 godzin) Normalny odstęp czasu między odpytaniami czasu sieci w milisekundach.
config_ntpPollingIntervalShorter 60000 (1 minuta) Interwał odpytywania sieci w milisekundach w przypadku ponawiania prób. Używana, gdy odświeżanie czasu się nie powiedzie.
config_ntpServers Pojedynczy wpis: ntp://time.android.com serwery NTP, z których można pobrać dokładny czas; Elementy muszą mieć postać:ntp://<host>[:port].
To nie jest zarejestrowany schemat URI IANA. .
config_ntpTimeout 5000 Czas oczekiwania na odpowiedź serwera NTP w milisekundach przed upływem limitu czasu.

Serwery

Domyślnie AOSP korzysta z serwerów czasu pod adresem time.android.com, który jest aliasem publicznego protokołu NTP Google. Ta usługa nie ma gwarancji jakości usług. Więcej informacji znajdziesz w najczęstszych pytaniach dotyczących publicznego protokołu NTP Google.

Obsługa wielu serwerów

W przypadku Androida 14 i nowszych wersji platforma obsługuje wiele serwerów NTP. Jest to przydatne w sytuacjach, gdy urządzenia są rozpowszechniane na całym świecie z jedną konfiguracją, ale dostęp do serwerów takich jak time.android.com jest w niektórych miejscach ograniczony.

Algorytm próbuje połączyć się z każdym serwerem określonym w config_ntpServerskluczu konfiguracji. Gdy system znajdzie serwer, który odpowiada, będzie go używać do momentu, aż nie uda mu się odświeżyć połączenia lub urządzenie zostanie ponownie uruchomione.

Dokładność

Domyślna synchronizacja czasu sieciowego na Androidzie korzysta z protokołu SNTP z pojedynczym zapytaniem o czas mniej więcej raz dziennie, aby zawsze mieć aktualny sygnał czasu.

Opóźnienia w sieci mają największy wpływ na niedokładność czasu w przypadku implementacji SNTP w Androidzie. SNTP zakłada symetryczne opóźnienia sieciowe, tzn. opóźnienie sieciowe żądania jest takie samo jak opóźnienie sieciowe odpowiedzi, a prawidłowy czas znajduje się dokładnie w połowie czasu podróży w obie strony. Czas przesyłania danych w sieci wynosi zwykle kilkaset milisekund, a w przypadku sieci przewodowej opóźnienie jest niemal symetryczne, co powoduje poziom niedokładności niemal niezauważalny dla użytkowników. W przypadku telefonii komórkowej lub radiowej występuje jednak kilka etapów, na których do transakcji sieciowej można wprowadzić stosunkowo długie, asymetryczne opóźnienia, co prowadzi do większej niedokładności.

Jeśli domyślne ustawienie AOSP dla config_ntpTimeout wynosi 5000 milisekund, a całe opóźnienie sieci występuje tylko na odcinku przychodzącym lub wychodzącym, maksymalny teoretyczny błąd wynosi około 2,5 sekundy.

Na ogólną dokładność zegara systemowego wpływa też zdolność urządzenia z Androidem do dokładnego śledzenia czasu, który upłynął od uzyskania sygnału czasu. Jest to problem dotyczący wszystkich funkcji pomiaru czasu na Androidzie, nie tylko wykrywania czasu sieciowego, dlatego usługa time_detector ignoruje stare sugestie dotyczące czasu. Usługa network_time_update_service odświeża się regularnie w interwale config_ntpPollingInterval, aby dostarczać do time_detector usługi aktualne sugestie dotyczące czasu i zapewnić, że time_detector usługa nie będzie korzystać z mniej priorytetowych, a często mniej dokładnych lub czasami nieprawidłowych źródeł czasu, takich jak telephony.

Gdy używane jest automatyczne wykrywanie czasu, na dokładność zegara systemowego urządzenia mogą mieć wpływ inne konfiguracje usługi time_detector, takie jak stałe i flagi, które określają, o ile sugerowany czas musi różnić się od bieżącego czasu zegara systemowego, zanim zegar zostanie dostosowany (ServiceConfigAccessorImpl.java).

Producenci urządzeń mogą modyfikować dokładność za pomocą powyższych opcji konfiguracji i stałych. Warto jednak pamiętać o ograniczeniach implementacji SNTP na platformie i potencjalnym wpływie częstszych operacji sieciowych na zużycie energii, wpływie częstszych, ale mniejszych korekt zegara na aplikacje działające na urządzeniu oraz wpływie na obciążenie serwera.

Inne zastosowania czasu sieciowego

Jeśli automatyczne wykrywanie czasu za pomocą źródła network nie jest skonfigurowane lub użytkownik wyłączył automatyczne wykrywanie czasu, czas uzyskany przez usługę network_time_update_service jest nadal używany przez te komponenty:

  • Metoda SystemClock.currentNetworkTimeClock().
  • wewnętrzne funkcje platformy, Na przykład A-GPS może szybciej uzyskać pierwsze ustalenie pozycji GNSS (lokalizacji), gdy ma informacje o czasie sieciowym.

Debugowanie i testowanie

W sekcji poniżej znajdziesz polecenia powłoki do debugowania i testowania funkcji wykrywania czasu sieciowego.

Korzystanie z usługi network_time_update_service

Aby zrzucić bieżący stan network_time_update_service, użyj tego polecenia:

adb shell cmd network_time_update_service dump

Aby wyświetlić zestaw opcji wiersza poleceń, które mogą pomóc w testowaniu, użyj tego polecenia:

adb shell cmd network_time_update_service help