Устройства Android автоматически пытаются получить правильное время в формате Unix epoch из сетевого источника. Android использует протокол Simple Network Time Protocol (SNTP), который, в свою очередь, использует протокол User Datagram Protocol (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 . Для этого сервиса не предусмотрено соглашение об уровне обслуживания (SLA). Более подробную информацию см. в разделе часто задаваемых вопросов (FAQ) Google Public NTP .
Поддержка нескольких серверов
Для Android 14 и выше платформа поддерживает несколько NTP-серверов. Это позволяет решать задачи, когда устройства распределены по всему миру с единой конфигурацией, но доступ к серверам, таким как time.android.com ограничен в определенных местах.
Алгоритм пытается подключиться к каждому серверу, указанному в ключе конфигурации config_ntpServers . Когда алгоритм находит сервер, который отвечает, система продолжает использовать этот сервер до тех пор, пока обновление не завершится неудачей или устройство не перезагрузится.
Точность
В Android по умолчанию используется синхронизация времени по сети с помощью протокола SNTP, при этом запрос времени отправляется примерно раз в день, чтобы всегда иметь актуальный сигнал времени.
Задержка в сети является существенным фактором, влияющим на неточность времени в реализации SNTP в Android. SNTP предполагает симметричные задержки в сети, то есть задержка запроса совпадает с задержкой ответа, и правильное время находится точно посередине этого сетевого цикла. Часто время сетевого цикла составляет несколько сотен миллисекунд, и в проводной сети задержка близка к симметричной, что приводит к уровням неточности, практически незаметным для пользователей. Однако в мобильной или радиотелефонии существует несколько этапов, на которых в сетевую транзакцию могут быть внесены относительно большие асимметричные задержки, что приводит к большей неточности.
При значении параметра config_ntpTimeout по умолчанию в AOSP, равном 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