El framework de Android usa varias fuentes de tiempo para la sincronización. En esta página, se abordan las fuentes de tiempo automáticas del Protocolo de hora de red (NTP) y la identidad de red y zona horaria (NITZ). De forma predeterminada, en Android 12 o versiones posteriores, el framework prioriza el NTP como fuente de tiempo por sobre el NITZ, ya que el NTP es más preciso y confiable que el NITZ. En situaciones en las que el NTP no está disponible, el framework recurre al NITZ. Esto es una inversión de la prioridad predeterminada de las versiones anteriores de la plataforma. De forma predeterminada, en Android 11 y versiones anteriores, el framework prioriza NITZ por sobre NTP.
Para obtener más detalles sobre este cambio, consulta los siguientes parches de AOSP: 1563678, 1513323.
Cómo configurar la prioridad de la fuente de tiempo
Para configurar qué fuente de tiempo tiene prioridad de forma predeterminada para una versión específica de Android, configura la clave config_autoTimeSourcesPriority
en frameworks/base/core/res/res/values/config.xml
durante la compilación. Las sugerencias de hora de la fuente de hora que se encuentra más arriba en la lista tienen prioridad sobre las fuentes que se encuentran más abajo en la lista.
Las fuentes de hora de Android que se pueden configurar se encuentran en TimeDetectorStrategy.java
.
Las siguientes fuentes están configuradas para usarse de forma predeterminada:
- Telefonía (NITZ)
- Red (NTP)
Prueba
Para verificar que el dispositivo usa NITZ cuando NTP no está disponible (cuando los datos móviles y la conexión Wi-Fi están inhabilitados), haz lo siguiente:
- Asegúrate de que haya una SIM que funcione en el DUT.
- Desactiva los datos móviles y la conexión Wi-Fi
- Pon el dispositivo en modo de avión para asegurarte de que la radio celular esté desactivada.
- Cómo desactivar la detección automática de la hora
- Configura el reloj manualmente con un valor de tiempo incorrecto en el futuro.
- Reinicia el dispositivo
- Activa la detección automática de la hora
- Cómo quitar el dispositivo del modo de avión
Estos pasos activan un cambio en el reloj del sistema en cuanto se recibe una señal de NITZ. Para verificar cómo se configura la hora del dispositivo, ejecuta el siguiente comando:
adb shell dumpsys time_detector
Para verificar que el reloj del sistema use NITZ, confirma lo siguiente en el resultado del comando:
mEnvironment.isAutoTimeDetectionEnabled()
:true
.mEnvironment.autoOriginPriorities()
contiene una lista de fuentes de tiempo, en la que las fuentes que se encuentran más arriba en la lista tienen prioridad sobre las que se encuentran más abajo.- La sección
Time change log
muestra que el reloj del sistema se configura con una sugerencia de telefonía. - La sección
Telephony suggestion history
contiene sugerencias de horarios. - La sección
Network suggestion history
está vacía.
Las sugerencias de hora en las secciones Telephony suggestion history
y Network suggestion history
se consideran la fuente de información sobre la hora. Si el dispositivo está conectado a Internet y tiene una tarjeta SIM, las sugerencias se generan con NTP (red) y NITZ (telefonía). En este caso de prueba, solo la sección Telephony suggestion history
contiene sugerencias porque la NTP está inhabilitada.
En la sección Time change log
, se registran los cambios realizados en el reloj del sistema del dispositivo y la sugerencia utilizada. El reloj del sistema se configura según el orden de las fuentes de tiempo en la lista de prioridad de la clave config_autoTimeSourcesPriority
. Sin embargo, es posible que se ignoren las sugerencias de una fuente de mayor prioridad si son demasiado antiguas o no son válidas.
Además, si la sugerencia válida de mayor prioridad coincide con la hora actual del reloj del sistema del dispositivo en un par de segundos, la hora no cambiará.
En este caso de prueba, siempre que las sugerencias no estén desactualizadas, el reloj del sistema se configura con una de las sugerencias de Telephony suggestion history
.
A continuación, se muestra un ejemplo de un resultado en el que el dispositivo recurre al uso de NITZ cuando el NTP no está disponible.
TimeDetectorStrategy:
mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
mEnvironment.isAutoTimeDetectionEnabled()=true
mEnvironment.elapsedRealtimeMillis()=73059
mEnvironment.systemClockMillis()=1614186767818
mEnvironment.systemClockUpdateThresholdMillis()=2000
mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
mEnvironment.autoOriginPriorities()=[network,telephony]
Time change log:
66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
Telephony suggestion history:
key idx: 0=0
val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
Historic values=[
0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
]
Network suggestion history:
{Empty}
Gnss suggestion history:
{Empty}
External suggestion history:
{Empty}
A modo de referencia para comparar con el resultado en la situación de prueba, a continuación, se muestra un ejemplo de un resultado típico en el que el dispositivo recibe sugerencias de hora de fuentes de hora de NTP y NITZ.
TimeDetectorStrategy:
mLastAutoSystemClockTimeSet=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}
mEnvironment.isAutoTimeDetectionEnabled()=true
mEnvironment.elapsedRealtimeMillis()=302926
mEnvironment.systemClockMillis()=1614186997685
mEnvironment.systemClockUpdateThresholdMillis()=2000
mEnvironment.autoTimeLowerBound()=2021-02-24T15:44:15Z(1614181455000)
mEnvironment.autoOriginPriorities()=[network,telephony]
Time change log:
66261 / 2021-02-24T17:12:41.020Z - Set system clock using time=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000} cause=Found good telephony suggestion., bestTelephonySuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}, detectionReason=New telephony time suggested. timeSuggestion=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]} elapsedRealtimeMillis=66259 newSystemClockMillis=1614186761019
Telephony suggestion history:
key idx: 0=0
val idx: 0=TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
Historic values=[
0@PT1M6.258S: TelephonyTimeSuggestion{mSlotIndex='0', mUtcTime=TimestampedValue{mReferenceTimeMillis=66240, mValue=1614186761000}, mDebugInfo=[Sending new time suggestion nitzSignal=TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}}, reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=66240, mValue=NitzData{mOriginalString=21/02/24,17:12:41+00,00, mZoneOffset=0, mDstOffset=0, mCurrentTimeMillis=1614186761000, mEmulatorHostTimeZone=null}})]}
]
Network suggestion history:
0@PT4M4.04S: NetworkTimeSuggestion{mUtcTime=TimestampedValue{mReferenceTimeMillis=244038, mValue=1614186939242}, mDebugInfo=[Origin: NetworkTimeUpdateService. event=3]}
Gnss suggestion history:
{Empty}
External suggestion history:
{Empty}