Los dispositivos Android intentan obtener automáticamente la época Unix correcta desde una fuente de red. Android utiliza el protocolo SNTP, que utiliza el protocolo UDP, para obtener información horaria.
Los componentes descritos en esta página son parte del sistema de detección automática de la hora denominado origen de la hora de la red . Se puede utilizar una señal horaria de un servidor horario de red para configurar el reloj del sistema del dispositivo Android cuando el dispositivo admite la detección automática de la hora y el servicio time_detector
está configurado para usarlo.
De forma predeterminada, Android utiliza el origen de la hora de la red como origen principal de detección automática de la hora.
Sistema de detección de tiempo de red.
El servicio network_time_update_service
que se ejecuta en el servidor del sistema Android implementa el sistema de detección de hora de la red. El servicio utiliza periódicamente SNTP para obtener una señal horaria de un servidor. El servicio también monitorea la conectividad de la red y activa una actualización de la hora cuando no hay una señal horaria reciente disponible después de períodos prolongados de mala conectividad.
El servicio network_time_update_service
intenta obtener una señal horaria después del inicio y cuando se establece por primera vez la conectividad de la red. Luego, el servicio intenta mantener actualizada la última señal que mantiene. Equilibra las necesidades de los dispositivos Android individuales con la carga sustancial que podrían generar muchos dispositivos Android en todo el mundo al actualizar su tiempo.
Mediante API internas, network_time_update_service
envía sugerencias de tiempo de red al servicio time_detector
. Otros componentes de la plataforma Android utilizan estas sugerencias de tiempo de red.
Después de recibir sugerencias del origen de la hora de la red, el servicio time_detector
determina si se actualiza el reloj del sistema de acuerdo con las reglas de priorización configuradas.
Para configurar el sistema de detección automática de hora para utilizar las sugerencias de origen de la red para configurar el reloj del sistema automáticamente, utilice el archivo de configuración del servidor del sistema core/res/res/values/config.xml
. Asegúrese de que la network
de valor esté contenida en config_autoTimeSourcesPriority
en la posición deseada. Para obtener más información, consulte Prioridad de fuente de tiempo .
Configuración del dispositivo
Esta sección describe cómo los fabricantes de dispositivos pueden configurar el sistema de detección de hora de la red.
La configuración básica de AOSP está en frameworks/base/core/res/res/values/config.xml
:
Clave de configuración | valor AOSP | Descripción |
---|---|---|
config_ntpRetry | 3 | Después de no poder actualizar, esta es la cantidad de veces que el sistema intenta sondear el tiempo de la red con un intervalo de sondeo NTP más corto ( config_ntpPollingIntervalShorter ), antes de retroceder y usar el intervalo de sondeo normal ( config_ntpPollingInterval ). Un valor inferior a 0 significa que el sistema vuelve a intentar realizar el sondeo en el intervalo de sondeo NTP más corto hasta que pueda actualizarse correctamente. |
config_ntpPollingInterval | 64800000 (18 horas) | El intervalo de sondeo de tiempo normal de la red en milisegundos. |
config_ntpPollingIntervalShorter | 60000 (1 minuto) | El intervalo de sondeo de tiempo de red de reintento en milisegundos. Se utiliza cuando falla una actualización de tiempo. |
config_ntpServers | Una sola entrada: ntp://time.android.com | Servidores NTP a utilizar para obtener una hora exacta. Los elementos deben tener el formato: ntp://<host>[:port] .Este no es un esquema URI de IANA registrado. |
config_ntpTimeout | 5000 | Tiempo de espera de una respuesta del servidor NTP en milisegundos antes del tiempo de espera. |
Servidores
De forma predeterminada, AOSP utiliza servidores de tiempo en time.android.com
, que es un alias de Google Public NTP . Este servicio no tiene SLA. Para obtener más información, consulte las preguntas frecuentes sobre NTP público de Google .
Soporte para múltiples servidores
Para Android 14 y versiones posteriores, el marco admite múltiples servidores NTP. Esto admite situaciones en las que los dispositivos se distribuyen globalmente con una única configuración, pero el acceso a servidores como time.android.com
está restringido en ciertos lugares.
El algoritmo prueba cada servidor especificado en la clave de configuración config_ntpServers
. Cuando encuentra uno que responde, el sistema continúa usando ese servidor hasta que no se actualiza o el dispositivo se reinicia.
Exactitud
La sincronización de hora de red predeterminada de Android utiliza SNTP con una única consulta de hora aproximadamente una vez al día para intentar garantizar que siempre tenga una señal horaria reciente.
Los efectos de la latencia de la red son el mayor contribuyente a la inexactitud del tiempo con la implementación SNTP de Android. SNTP supone retrasos de red simétricos, es decir, la latencia de red para la solicitud es la misma que la latencia de red para la respuesta, y el tiempo correcto se encuentra exactamente en el medio del viaje de ida y vuelta de la red. A menudo, el tiempo de ida y vuelta de la red es del orden de unos pocos cientos de milisegundos y en una red cableada la latencia es casi simétrica, lo que genera niveles de inexactitud que son casi imperceptibles para los usuarios. Sin embargo, en el caso de la telefonía móvil o la radiotelefonía, existen varias etapas en las que se pueden introducir retrasos asimétricos y relativamente largos en una transacción de red, lo que genera una mayor inexactitud.
Con la configuración predeterminada de AOSP para config_ntpTimeout
establecida en 5000
milisegundos, y si toda la latencia de la red se concentra únicamente en el tramo entrante o saliente, el error teórico máximo es de aproximadamente 2,5 segundos.
La precisión general del reloj del sistema también se ve afectada por la capacidad del dispositivo Android para realizar un seguimiento preciso del tiempo transcurrido después de obtener una señal horaria. Esta es una preocupación con todo el cronometraje en Android, no solo con la detección de la hora de la red, y es por eso que el servicio time_detector
ignora las sugerencias antiguas. El servicio network_time_update_service
se actualiza periódicamente utilizando el intervalo config_ntpPollingInterval
para mantener el servicio time_detector
provisto de sugerencias de hora nuevas y para garantizar que el servicio time_detector
no recurra a orígenes de hora de menor prioridad y, a menudo, de menor precisión u ocasionalmente incorrectos, como telephony
.
Cuando se utiliza la detección automática de hora, la precisión del reloj del sistema del dispositivo puede verse afectada por otras configuraciones del servicio time_detector
, como las constantes y los indicadores que afectan qué tan diferente debe ser una sugerencia de hora de la hora actual del reloj del sistema antes de que se ajuste el reloj ( ServiceConfigAccessorImpl.java
).
Los fabricantes de dispositivos pueden modificar la precisión utilizando las opciones y constantes de configuración anteriores. Pero es importante ser consciente de las limitaciones de la implementación SNTP de la plataforma y del impacto potencial en el consumo de energía debido a operaciones de red más frecuentes, el impacto en las aplicaciones que se ejecutan en el dispositivo debido a ajustes de reloj más frecuentes pero más pequeños y el efecto en la carga del servidor.
Otros usos del tiempo de red
Si la detección automática de la hora utilizando el origen network
no está configurada o si el usuario ha deshabilitado la detección automática de la hora, los siguientes componentes aún utilizan la hora obtenida por el servicio network_time_update_service
:
- El método
SystemClock.currentNetworkTimeClock()
. - Funciones internas de la plataforma. Por ejemplo, A-GPS puede localizar una primera posición GNSS (ubicación) más rápido cuando tiene información de hora de red.
Depuración y prueba
La siguiente sección describe los comandos de shell para depurar y probar la función de detección de hora de la red.
Interactuar con el servicio network_time_update_service
Para volcar el estado actual de network_time_update_service
, utilice:
adb shell cmd network_time_update_service dump
Para ver un conjunto de opciones de línea de comando que pueden ayudar con las pruebas, use:
adb shell cmd network_time_update_service help