Los dispositivos Android intentan obtener automáticamente el tiempo Unix correcto de tiempo de Unix desde una fuente de red. Android usa el protocolo SNTP, que usa el protocolo UDP, para obtener información de hora.
Los componentes descritos en esta página forman parte del sistema de detección automática de la hora denominado origen de hora de la red. Se puede usar una señal de tiempo de un servidor de hora de red para configurar el reloj del sistema del dispositivo Android cuando la detección de hora automática es compatible con el dispositivo y el servicio time_detector
está configurado para usarlo.
De forma predeterminada, Android usa el origen de la hora de red como el origen principal de la detección automática de la hora.
Sistema de detección de hora 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 red. El servicio usa SNTP de forma periódica para obtener una señal de tiempo de un servidor. El servicio también supervisa la conectividad de red y activa una actualización de tiempo cuando no hay una señal de hora reciente disponible después de períodos prolongados de conectividad deficiente.
El servicio network_time_update_service
intenta obtener una señal de hora después del inicio y cuando se establece la conectividad de red por primera vez. Luego, el servicio intenta mantener actualizado el indicador más reciente que tiene. Equilibra las necesidades de los dispositivos Android individuales con la carga sustancial que podrían generar muchos dispositivos Android en todo el mundo actualizando su hora.
Con las APIs internas, network_time_update_service
envía sugerencias de tiempo de red al servicio time_detector
. Luego, otros componentes de la plataforma de Android usan estas sugerencias de horarios de red.
Después de recibir sugerencias del origen de hora de la red, el servicio time_detector
determina si se debe actualizar el reloj del sistema según las reglas de priorización configuradas.
Para configurar el sistema de detección de hora automática para que use las sugerencias de origen de la red para establecer el reloj del sistema automáticamente, usa el archivo de configuración del servidor del sistema core/res/res/values/config.xml
. Asegúrate de que el valor network
esté contenido en config_autoTimeSourcesPriority
en la posición deseada. Para obtener más información, consulta Prioridad de la fuente de tiempo.
Configuración del dispositivo
En esta sección, se describe cómo los fabricantes de dispositivos pueden configurar el sistema de detección de hora de red.
La configuración base del AOSP se encuentra en frameworks/base/core/res/res/values/config.xml
:
Clave de configuración | Valor de AOSP | Descripción |
---|---|---|
config_ntpRetry |
3 |
Después de no poder actualizarse, esta es la cantidad de veces que el sistema intenta sondear la hora de la red con un intervalo de sondeo de 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 sondear en el intervalo de sondeo de NTP más corto hasta que puede actualizarse correctamente. |
config_ntpPollingInterval |
64800000 (18 horas) |
Es el intervalo normal de sondeo de hora de red en milisegundos. |
config_ntpPollingIntervalShorter |
60000 (1 minuto) |
El intervalo de sondeo del tiempo de red de reintento en milisegundos. Se usa cuando falla una actualización de hora. |
config_ntpServers |
Una sola entrada: ntp://time.android.com |
Son los servidores NTP que se usarán para obtener una hora precisa. Los elementos deben tener el siguiente formato: ntp://<host>[:port] .
Este no es un esquema de URI registrado de la IANA. |
config_ntpTimeout |
5000 | Es el tiempo de espera para una respuesta del servidor NTP en milisegundos antes del tiempo de espera. |
Servidores
De forma predeterminada, AOSP usa servidores de hora en time.android.com
, que es un alias para Google Public NTP. Este servicio no tiene un ANS. Para obtener más detalles, consulta Preguntas frecuentes de NTP públicas de Google.
Compatibilidad con varios servidores
En Android 14 y versiones posteriores, el framework admite varios servidores NTP. Esto admite situaciones en las que los dispositivos se distribuyen globalmente con una sola 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 se reinicia el dispositivo.
Precisión
La sincronización de hora de red predeterminada de Android usa SNTP con una sola consulta de hora aproximadamente una vez al día para intentar garantizar que siempre tenga una señal de hora reciente.
Los efectos de latencia de la red son los que más contribuyen a la imprecisión de la hora con la implementación de SNTP de Android. SNTP supone demoras de red simétricas, es decir, que la latencia de red de la solicitud es la misma que la latencia de red de la respuesta, y la hora correcta se encuentra exactamente en medio de ese recorrido de ida y vuelta de la red. A menudo, el tiempo de ida y vuelta de la red es del orden de unos cientos de milisegundos y, en una red con cable, la latencia es casi simétrica, lo que genera niveles de imprecisión que son casi imperceptibles para los usuarios. Sin embargo, con la telefonía móvil o de radio, hay varias etapas en las que se pueden insertar retrasos relativamente largos y asimétricos en una transacción de red, lo que genera una mayor imprecisión.
Con el parámetro de configuración predeterminado de AOSP para config_ntpTimeout
establecido 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 de hacer un seguimiento del tiempo transcurrido con precisión después de obtener una señal de tiempo. Esta es una preocupación con todo el mantenimiento del tiempo en Android, no solo con la detección de la hora de red, y es por eso que el servicio time_detector
ignora las sugerencias de hora anteriores. El servicio network_time_update_service
se actualiza periódicamente con el intervalo config_ntpPollingInterval
para mantener el servicio time_detector
con sugerencias de hora actualizadas y garantizar que no recurra a orígenes de hora incorrectos, a menudo de menor prioridad y precisión, como telephony
.time_detector
Cuando se usa la detección de hora automática, la precisión del reloj del sistema del dispositivo puede verse afectada por otras configuraciones del servicio time_detector
, como las constantes y marcas que afectan la diferencia que debe tener una sugerencia de hora con respecto a la hora actual del reloj del sistema antes de que se ajuste (ServiceConfigAccessorImpl.java
).
Los fabricantes de dispositivos pueden modificar la precisión con las opciones y constantes de configuración anteriores. Sin embargo, es importante tener en cuenta las limitaciones de la implementación de SNTP de la plataforma y el posible impacto en el consumo de energía debido a operaciones de red más frecuentes, el impacto en las apps 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 de la hora de red
Si no se configuró la detección automática de la hora con el origen network
o si el usuario inhabilitó la detección automática de la hora, los siguientes componentes seguirán usando la hora que obtuvo el servicio network_time_update_service
:
- El método
SystemClock.currentNetworkTimeClock()
. - Funciones internas de la plataforma. Por ejemplo, el A-GPS puede ubicar una primera corrección de GNSS (ubicación) más rápido cuando tiene información de hora de red.
Depuración y pruebas
En la siguiente sección, se describen los comandos de shell para depurar y probar la función de detección de hora de red.
Interactuar con el servicio network_time_update_service
Para volcar el estado actual de network_time_update_service
, usa lo siguiente:
adb shell cmd network_time_update_service dump
Para ver un conjunto de opciones de línea de comandos que pueden ayudarte con las pruebas, usa lo siguiente:
adb shell cmd network_time_update_service help