Los dispositivos Android intentan automáticamente obtener la hora de época de Unix correcta de una fuente de red. Android usa el protocolo SNTP, que a su vez usa el protocolo UDP, para obtener información de la hora.
Los componentes que se describen en esta página forman parte del sistema automático de detección de hora al que se hace referencia como origen de hora de la red. Se puede usar un indicador de hora de un servidor de hora de la red para configurar el reloj del sistema del dispositivo Android cuando el dispositivo admite la detección automática de hora y el servicio time_detector
está configurado para usarlo.
De forma predeterminada, Android usa el origen de hora de la red como el origen principal de detección automática de hora.
Sistema de detección de hora de la 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 periódicamente para obtener un indicador de tiempo de un servidor. El servicio también supervisa la conectividad de red y activa una actualización de la hora cuando no hay un indicador 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 tiempo después del inicio y cuando se establece la conectividad de red por primera vez. Luego, el servicio intenta mantener actualizada la señal más reciente que tiene. Equilibra las necesidades de los dispositivos Android individuales con la carga sustancial que podrían generar muchos dispositivos Android de todo el mundo que actualizan su hora.
Con las APIs internas, network_time_update_service
envía sugerencias de hora de red al servicio time_detector
. Luego, otros componentes de la plataforma de Android usan estas sugerencias de hora de red.
Después de recibir sugerencias del origen de hora de la red, el servicio time_detector
determina si debe actualizar el reloj del sistema según las reglas de priorización configuradas.
Para configurar el sistema de detección automática de hora para que use las sugerencias de origen de red y establezca 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
se encuentre en config_autoTimeSourcesPriority
en la posición deseada. Para obtener más detalles, 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 la red.
La configuración base de AOSP se encuentra en frameworks/base/core/res/res/values/config.xml
:
Clave de configuración | Valor del AOSP | Descripción |
---|---|---|
config_ntpRetry |
3 |
Después de no poder actualizar, esta es la cantidad de veces que el sistema intenta sondear la hora 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 el sondeo con el intervalo de sondeo NTP más corto hasta que puede actualizar correctamente. |
config_ntpPollingInterval |
64800000 (18 horas) |
Es el intervalo normal de sondeo de la hora de la red en milisegundos. |
config_ntpPollingIntervalShorter |
60000 (1 minuto) |
Es el intervalo de sondeo de la red para reintentos en milisegundos. Se usa cuando falla una actualización de tiempo. |
config_ntpServers |
Una sola entrada: ntp://time.android.com |
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 en IANA. |
config_ntpTimeout |
5000 | 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 de Google Public NTP. Este servicio no tiene ANS. Para obtener más información, consulta las Preguntas frecuentes sobre NTP públicos 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 a nivel global con una sola configuración, pero en las que 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 sigue usando ese servidor hasta que no se pueda actualizar o se reinicie 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 un indicador de hora reciente.
Los efectos de latencia de la red son el factor que más contribuye a la inexactitud del tiempo con la implementación de SNTP de Android. El SNTP supone que hay retrasos simétricos en la red, es decir, la latencia de red de la solicitud es la misma que la de la respuesta, y la hora correcta se encuentra exactamente en el medio de ese 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 imprecisión que son casi imperceptibles para los usuarios. Sin embargo, con la telefonía móvil o por radio, hay varias etapas en las que se pueden insertar demoras asimétricas relativamente largas en una transacción de red, lo que genera una mayor imprecisión.
Con el parámetro de configuración predeterminado del AOSP para config_ntpTimeout
establecido en 5000
milisegundos, y si toda la latencia de la red se concentra únicamente en el tramo de entrada o salida, 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 hacer un seguimiento preciso del tiempo transcurrido después de obtener un indicador de tiempo. Esto es un problema con todos los registros de hora en Android, no solo con la detección de hora de red, y es por eso que el servicio time_detector
ignora las sugerencias de hora antiguas. El servicio network_time_update_service
se actualiza periódicamente con el intervalo config_ntpPollingInterval
para mantener el servicio time_detector
con sugerencias de tiempo actualizadas y garantizar que el servicio time_detector
no recurra a orígenes de tiempo de menor prioridad y, a menudo, de menor precisión o, en ocasiones, incorrectos, como telephony
.
Cuando se usa 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 las 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 el reloj (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 batería de las operaciones de red más frecuentes, el impacto en las apps que se ejecutan en el dispositivo de los 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 la red
Si no se configura 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 obtiene el servicio network_time_update_service
:
- El método
SystemClock.currentNetworkTimeClock()
. - Son funciones internas de la plataforma. Por ejemplo, el A-GPS puede ubicar una primera fijación de GNSS (ubicación) más rápido cuando tiene información de la hora de la 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.
Interactúa con el servicio network_time_update_service
Para volcar el estado actual de network_time_update_service
, usa el siguiente comando:
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 el siguiente comando:
adb shell cmd network_time_update_service help