Prioridad de fuente de tiempo

El marco de trabajo de Android utiliza varias fuentes de tiempo para la sincronización de tiempo. Esta página se centra en 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 superior, el marco prioriza NTP como fuente de tiempo sobre NITZ porque NTP es más preciso y confiable que NITZ. En situaciones en las que NTP no está disponible, el marco recurre a 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 marco prioriza NITZ sobre NTP.

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

Configuración de 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, configure la clave config_autoTimeSourcesPriority en frameworks/base/core/res/res/values/config.xml en el momento de la compilación. Las sugerencias de tiempo de la fuente de tiempo que está más arriba en la lista tienen prioridad sobre las fuentes que están 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 su uso de forma predeterminada:

  • Telefonía (NITZ)
  • Red (NTP)

Pruebas

Para verificar que el dispositivo usa NITZ cuando NTP no está disponible (cuando los datos móviles y Wi-Fi están deshabilitados), haga lo siguiente:

  1. Asegúrese de que haya una SIM que funcione en el DUT
  2. Desactivar datos móviles y Wi-Fi
  3. Ponga el dispositivo en modo avión para asegurarse de que la radio celular esté apagada
  4. Desactivar la detección automática de tiempo
  5. Configure el reloj manualmente a un valor de tiempo incorrecto en el futuro
  6. Reiniciar el dispositivo
  7. Activar la detección automática de tiempo
  8. Saca el dispositivo del modo avión

Estos pasos activan un cambio en el reloj del sistema tan pronto como se recibe una señal NITZ. Para verificar cómo se configura la hora del dispositivo, ejecute el siguiente comando:

adb shell dumpsys time_detector

Para verificar que el reloj del sistema usa NITZ, confirme lo siguiente en la salida del comando:

  • mEnvironment.isAutoTimeDetectionEnabled() es true .
  • 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.
  • La sección Time change log muestra que el reloj del sistema se configura mediante una sugerencia de telefonía.
  • La sección Telephony suggestion history contiene sugerencias de tiempo.
  • La sección del Network suggestion history está vacía.

Las sugerencias de tiempo en las secciones Historial de Telephony suggestion history Network suggestion history se consideran la fuente de la verdad para el tiempo. Si el dispositivo está conectado a Internet y tiene una tarjeta SIM, las sugerencias se generan utilizando tanto NTP (red) como NITZ (telefonía). En este caso de prueba, solo la sección del Telephony suggestion history contiene sugerencias porque NTP está deshabilitado.

La sección Time change log registra los cambios realizados en el reloj del sistema del dispositivo y la sugerencia utilizada. El reloj del sistema se establece en función del orden de las fuentes de tiempo en la lista de prioridades de la clave config_autoTimeSourcesPriority . Sin embargo, las sugerencias de una fuente de mayor prioridad pueden ignorarse 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, la hora no se cambiará. En este caso de prueba, siempre que las sugerencias no estén desactualizadas, el reloj del sistema se configura utilizando una de las sugerencias del Telephony suggestion history .

El siguiente es un ejemplo de una salida en la que el dispositivo recurre al uso de 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}

A modo de referencia como comparación con la salida en el escenario de prueba, el siguiente es un ejemplo de una salida típica en la 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}