Prioridad de la fuente de tiempo

El framework de Android usa varias fuentes de tiempo para la sincronización de la hora. Esta página se enfoca en el protocolo NTP y Fuentes de tiempo automáticas de identidad de red y zona horaria (NITZ). De forma predeterminada, en Android 12 o versiones posteriores, el framework prioriza NTP como fuente de tiempo sobre NITZ porque NTP es es más preciso y confiable que NITZ. En situaciones en las que NTP no está disponible, el framework recurre a NITZ. Esto es una reversión de la prioridad predeterminada de las versiones anteriores del plataforma. De forma predeterminada en Android 11 y versiones anteriores, el framework prioriza NITZ. por NTP.

Para obtener más detalles sobre este cambio, consulta los siguientes parches de AOSP: 1563678. 1513323.

Configura la prioridad de la fuente de tiempo

Para configurar qué fuente de tiempo tiene prioridad de forma predeterminada para un dispositivo Android específico actual, configura el config_autoTimeSourcesPriority en frameworks/base/core/res/res/values/config.xml durante el tiempo de compilación. Hora tienen prioridad las sugerencias de la fuente de tiempo que está más arriba en la lista sobre las fuentes que están 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 use NITZ cuando NTP no está disponible (si los datos móviles y la conexión Wi-Fi están inhabilitados), haz lo siguiente:

  1. Asegúrate de que haya una SIM que funcione en el DUT
  2. Cómo desactivar los datos móviles y el Wi-Fi
  3. Pon el dispositivo en modo de avión para asegurarte de que la radio móvil esté desactivada.
  4. Cómo desactivar la detección automática de la hora
  5. Configurar el reloj manualmente con un valor de hora incorrecto en el futuro
  6. Reinicia el dispositivo.
  7. Cómo activar la detección automática de la hora
  8. Desactiva el modo de avión en el dispositivo

Estos pasos activan un cambio en el reloj del sistema en cuanto se muestra una NITZ. cuando se recibe la señal. Para comprobar la configuración de 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 comando Resultado:

  • mEnvironment.isAutoTimeDetectionEnabled(): true.
  • mEnvironment.autoOriginPriorities() contiene una lista de fuentes de tiempo Las fuentes que están más arriba en la lista tienen prioridad sobre las que están más abajo en la lista.
  • En la sección Time change log, se muestra que el reloj del sistema se configura con un 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 horarios en Telephony suggestion history y Las secciones Network suggestion history se consideran la fuente de información para tiempo. Si el dispositivo está conectado a Internet y tiene una tarjeta SIM, se generan con NTP (red) y NITZ (telefonía). En este caso de prueba, solo la sección Telephony suggestion history contiene sugerencias porque NTP está inhabilitado.

En la sección Time change log, se registran los cambios realizados en la configuración del dispositivo y la sugerencia usada. El reloj del sistema se configura según la el orden de las fuentes de tiempo en la lista de prioridades en la tecla config_autoTimeSourcesPriority. Sin embargo, las sugerencias de un Es posible que se ignore la fuente con mayor prioridad si la sugerencia es demasiado antigua o no válida. Además, si la sugerencia válida de mayor prioridad coincide con la configuración del reloj del sistema en un par de segundos. En este caso de prueba, siempre que las sugerencias no estén desactualizadas, el reloj del sistema se establece con una de las sugerencias de Telephony suggestion history.

El siguiente es un ejemplo de una salida en la que el dispositivo recurre a usar NITZ cuando 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 una comparación con el resultado en el escenario de prueba, el Este es un ejemplo de un resultado típico en el que el dispositivo recibe sugerencias de horarios de fuentes de hora 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}