Устройства Android автоматически пытаются получить правильное время эпохи Unix из сетевого источника. Android использует протокол SNTP, который получает информацию о времени с помощью протокола UDP.
Компоненты, описанные на этой странице, являются частью системы автоматического определения времени, которая называется источником сетевого времени. Сигнал времени от сетевого сервера времени можно использовать для установки системных часов устройства Android, если на устройстве поддерживается автоматическое определение времени и служба time_detector настроена на его использование.
По умолчанию Android использует в качестве основного источника автоматического определения времени данные сети.
Система определения времени по сети
Сервис network_time_update_service, работающий на сервере системы Android, реализует систему обнаружения сетевого времени. Сервис периодически использует SNTP
для получения сигнала времени от сервера. Сервис также отслеживает подключение к сети и запускает обновление времени, если после длительного периода плохого подключения не поступало сигналов времени.
Сервис network_time_update_service пытается получить сигнал времени после загрузки и при первом установлении сетевого подключения. Затем сервис пытается поддерживать актуальность последнего полученного сигнала. Он учитывает потребности отдельных устройств Android и значительную нагрузку, которая может возникнуть, если множество устройств Android по всему миру будут обновлять время одновременно.
Сервис network_time_update_service отправляет сервису time_detector предложения по времени сети с помощью внутренних API. Другие компоненты платформы Android используют эти предложения.
После получения предложений от источника времени в сети сервис time_detector
определяет, нужно ли обновлять системные часы, в соответствии с настроенными правилами приоритезации.
Чтобы настроить автоматическое определение времени с помощью предложений от сети, используйте файл конфигурации системного сервера core/res/res/values/config.xml. Убедитесь, что значение network содержится в config_autoTimeSourcesPriority в нужном месте. Подробнее о приоритете источника времени…
Конфигурация устройства
В этом разделе рассказывается, как производители устройств могут настроить систему определения времени в сети.
Базовая конфигурация AOSP находится в файле config.xml:
frameworks/base/core/res/res/values/config.xml:
| Ключ конфигурации | Значение AOSP | Описание |
|---|---|---|
config_ntpRetry |
3 |
Если не удалось обновить время, система попытается опросить сетевое время с более коротким интервалом NTP (config_ntpPollingIntervalShorter) указанное количество раз, прежде чем вернуться к обычному интервалу опроса (config_ntpPollingInterval). Если значение меньше 0, система будет повторять опрос с более коротким интервалом NTP, пока не сможет успешно обновить время. |
config_ntpPollingInterval |
64800000 (18 часов) |
Обычный интервал опроса сетевого времени в миллисекундах. |
config_ntpPollingIntervalShorter |
60000 (1 минута) |
Интервал повторных попыток опроса сети в миллисекундах. Используется, когда не удается обновить время. |
config_ntpServers |
Одна запись: ntp://time.android.com |
NTP-серверы, которые используются для получения точного времени. Элементы должны быть в следующем формате:
ntp://<host>[:port].
Это не зарегистрированная схема URI IANA. |
config_ntpTimeout |
5000 | Время ожидания ответа от NTP-сервера в миллисекундах до истечения времени ожидания. |
Серверы
По умолчанию AOSP использует серверы времени time.android.com, которые являются псевдонимом для Google Public NTP. Для этого сервиса не предусмотрено соглашение об уровне обслуживания. Дополнительную информацию можно найти в разделе Часто задаваемые вопросы о публичном NTP-сервере Google.
Поддержка нескольких серверов
В Android 14 и более поздних версиях фреймворк поддерживает несколько NTP-серверов. Это позволяет использовать одну конфигурацию для устройств по всему миру, даже если доступ к серверам, таким как time.android.com, ограничен в некоторых регионах.
Алгоритм пытается подключиться к каждому серверу, указанному в ключе конфигурации config_ntpServers. Когда алгоритм находит сервер, который отвечает, система продолжает использовать его, пока не произойдет сбой при обновлении или перезагрузка устройства.
Точность
По умолчанию в Android для синхронизации времени в сети используется протокол SNTP с одним запросом времени примерно раз в день, чтобы всегда получать актуальный сигнал времени.
Задержка в сети – одна из основных причин неточности времени при использовании SNTP в Android. SNTP предполагает симметричные задержки в сети, то есть задержка запроса равна задержке ответа, а точное время находится ровно посередине между ними. Как правило, время приема-передачи данных в сети составляет несколько сотен миллисекунд, а в проводной сети задержка почти симметрична, поэтому неточности практически незаметны для пользователей. Однако при использовании мобильной или радиосвязи в сетевую транзакцию могут быть добавлены относительно длинные асимметричные задержки, что приводит к большей неточности.
Если для параметра config_ntpTimeout задано значение по умолчанию 5000 мс и задержка сети приходится только на входящий или исходящий трафик, максимальная теоретическая погрешность составляет около 2, 5 секунды.
На точность системных часов также влияет способность устройства Android отслеживать прошедшее время после получения сигнала времени. Эта проблема касается всех часов на устройствах Android, а не только определения времени по сети, поэтому служба time_detector игнорирует устаревшие предложения. Сервис
network_time_update_service регулярно обновляется с интервалом
config_ntpPollingInterval, чтобы сервис time_detector
получал актуальные предложения времени и time_detector
не переключался на менее приоритетные и часто менее точные или
иногда неверные источники времени, такие как telephony.
При использовании автоматического определения времени на точность системных часов устройства могут влиять другие конфигурации службы time_detector, например константы и флаги, определяющие, насколько предложенное время должно отличаться от текущего времени системных часов, чтобы часы были скорректированы (ServiceConfigAccessorImpl.java).
Производители устройств могут изменять точность с помощью указанных выше параметров конфигурации и констант. Однако важно учитывать ограничения реализации SNTP на платформе и возможное влияние на энергопотребление из-за более частых сетевых операций, влияние на приложения, работающие на устройстве, из-за более частых, но меньших корректировок часов, а также влияние на нагрузку на сервер.
Другие способы использования времени сети
Если автоматическое определение времени с помощью источника network не настроено или пользователь отключил его, время, полученное сервисом network_time_update_service, все равно используется следующими компонентами:
- Метод
SystemClock.currentNetworkTimeClock(). - Внутренние функции платформы. Например, A-GPS может быстрее определить местоположение с помощью GNSS (спутниковой навигационной системы), если у нее есть информация о времени сети.
Отладка и тестирование
В следующем разделе описаны команды оболочки для отладки и тестирования функции определения времени по сети.
Взаимодействие со службой network_time_update_service
Чтобы получить текущее состояние network_time_update_service, используйте следующую команду:
adb shell cmd network_time_update_service dumpЧтобы посмотреть набор параметров командной строки, которые могут помочь при тестировании, используйте следующую команду:
adb shell cmd network_time_update_service help