Устройства Android автоматически пытаются получить правильное время эпохи Unix из сетевого источника. Android использует протокол SNTP, который использует протокол UDP, для получения информации о времени.
Компоненты, описанные на этой странице, являются частью системы автоматического определения времени, называемой источником сетевого времени . Сигнал времени с сетевого сервера времени можно использовать для установки системных часов устройства Android, если на устройстве поддерживается автоматическое определение времени и служба time_detector
настроена на его использование.
По умолчанию Android использует источник сетевого времени в качестве основного источника автоматического определения времени.
Система определения сетевого времени
Служба network_time_update_service
, работающая на системном сервере Android, реализует систему определения сетевого времени. Служба периодически использует SNTP для получения сигнала времени от сервера. Служба также контролирует сетевое подключение и запускает обновление времени, когда последний сигнал времени недоступен после длительных периодов плохого подключения.
Служба network_time_update_service
пытается получить сигнал времени после загрузки и при первом установлении сетевого подключения. Затем служба пытается сохранить последний имеющийся у нее сигнал в актуальном состоянии. Он уравновешивает потребности отдельных устройств Android со значительной нагрузкой, которую могут создавать многие устройства Android по всему миру, освежающие свое время.
Используя внутренние API, network_time_update_service
отправляет предложения по сетевому времени в службу time_detector
. Другие компоненты платформы Android затем используют эти предложения по времени в сети.
После получения предложений от источника сетевого времени сервис time_detector
определяет, следует ли обновлять системные часы в соответствии с настроенными правилами расстановки приоритетов .
Чтобы настроить систему автоматического определения времени на использование предложений сетевого происхождения для автоматической установки системных часов, используйте файл конфигурации системного сервера core/res/res/values/config.xml
. Убедитесь, что network
создания ценности содержится в config_autoTimeSourcesPriority
в нужной позиции. Подробности см. в разделе «Приоритет источника времени» .
Конфигурация устройства
В этом разделе описывается, как производители устройств могут настроить систему определения времени сети.
Базовая конфигурация AOSP находится в 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 . У этой услуги нет соглашения об уровне обслуживания. Подробности см. в FAQ по публичному NTP Google .
Поддержка нескольких серверов
Для Android 14 и более поздних версий платформа поддерживает несколько серверов NTP. Это поддерживает ситуации, когда устройства распределены по всему миру с одной конфигурацией, но доступ к таким серверам, как time.android.com
, ограничен в определенных местах.
Алгоритм проверяет каждый сервер, указанный в конфигурационном ключе config_ntpServers
. Когда он находит тот, который отвечает, система продолжает использовать этот сервер до тех пор, пока он не перестанет обновляться или устройство не перезагрузится.
Точность
Сетевая синхронизация времени в Android по умолчанию использует SNTP с одним запросом времени примерно один раз в день, чтобы гарантировать, что он всегда имеет последний сигнал времени.
Эффекты задержки в сети вносят наибольший вклад в неточность времени при реализации SNTP в Android. SNTP предполагает симметричные сетевые задержки, то есть задержка в сети для запроса такая же, как задержка в сети для ответа, а правильное время находится точно в середине этого обратного прохождения по сети. Зачастую время прохождения сигнала туда и обратно составляет порядка нескольких сотен миллисекунд, а в проводной сети задержка близка к симметричной, что приводит к уровням неточностей, которые практически незаметны для пользователей. Однако в случае мобильной или радиотелефонии существует несколько этапов, на которых в сетевую транзакцию могут вноситься относительно длительные асимметричные задержки, что приводит к большей неточности.
Если для параметра AOSP по умолчанию для 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