El framework de Android usa varias fuentes de tiempo para la sincronización de la hora. En esta página, se abordan las fuentes de tiempo automáticas del Protocolo de tiempo 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 la 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. Esta es una inversión de la prioridad predeterminada de versiones anteriores de la plataforma. De forma predeterminada, en Android 11 y versiones anteriores, el framework prioriza el NITZ por sobre el NTP.
Para obtener más detalles sobre este cambio, consulta los siguientes parches de AOSP: 1563678 y 1513323.
Configura 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
config_autoTimeSourcesPriority
clave en frameworks/base/core/res/res/values/config.xml durante el tiempo de compilación. Las sugerencias de tiempo de la fuente de tiempo 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 tiempo 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 use NITZ cuando el 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 avión para asegurarte de que la radio celular esté desactivada.
- Desactiva la detección automática de la hora.
- Configura el reloj de forma manual con un valor de hora incorrecto en el futuro.
- Reinicia el dispositivo.
- Activa la detección automática de la hora.
- Saca el dispositivo del modo de avión.
Estos pasos activan un cambio en el reloj del sistema en cuanto se recibe una señal NITZ. Para verificar cómo se configura la hora del dispositivo, ejecuta el siguiente comando:
adb shell dumpsys time_detectorPara verificar que el reloj del sistema use NITZ, confirma lo siguiente en el resultado del comando:
mEnvironment.isAutoTimeDetectionEnabled()estrue.mEnvironment.autoOriginPriorities()contiene una lista de fuentes de tiempo con fuentes más altas en la lista que tienen prioridad sobre las fuentes más bajas en la lista.- En la sección
Time change log, se muestra que el reloj del sistema se configura con una sugerencia de telefonía. - La sección
Telephony suggestion historycontiene sugerencias de tiempo. - La sección
Network suggestion historyestá vacía.
Las sugerencias de tiempo en las secciones Telephony suggestion history y Network suggestion history se consideran la fuente de información para 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 el NTP está inhabilitado.
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 la sugerencia es demasiado antigua o no es válida.
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, no se cambiará la hora.
En este caso de prueba, siempre que las sugerencias no estén desactualizadas, el reloj del sistema se configurará 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}
Como referencia para comparar con el resultado en el caso de prueba, a continuación, se muestra un ejemplo de un resultado típico en el que el dispositivo recibe sugerencias de tiempo de las fuentes de tiempo 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}