Prioridad de fuente de tiempo

El marco de Android utiliza varias fuentes de tiempo para la sincronización horaria. Esta página se centra en las fuentes horarias automáticas del protocolo de tiempo de red (NTP) y de 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 de AOSP: 1563678 , 1513323 .

Configurar la prioridad de la fuente horaria

Para configurar qué fuente de hora 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 hora de la fuente de hora que está más arriba en la lista tienen prioridad sobre las fuentes que están más abajo en la lista.

Las fuentes horarias 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 tarjeta SIM que funcione en el DUT
  2. Desactivar datos móviles y Wi-Fi
  3. Pon el dispositivo en modo avión para asegurarte de que la radio del celular esté apagada.
  4. Desactivar la detección automática de la hora
  5. Configure el reloj manualmente a un valor de hora incorrecto en el futuro
  6. Reinicia el dispositivo
  7. Activar la detección automática de tiempo
  8. Saque el dispositivo del modo avión

Estos pasos desencadenan un cambio en el reloj del sistema tan pronto como se recibe una señal NITZ. Para comprobar cómo está configurada la hora del dispositivo, ejecute el siguiente comando:

adb shell dumpsys time_detector

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

  • mEnvironment.isAutoTimeDetectionEnabled() es true .
  • mEnvironment.autoOriginPriorities() contiene una lista de fuentes de tiempo con las 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 está configurado mediante una sugerencia de telefonía.
  • La sección Telephony suggestion history contiene sugerencias de tiempo.
  • La sección Network suggestion history está vacía.

Las sugerencias de tiempo en las secciones Telephony suggestion history e Network suggestion history se consideran la fuente de verdad para el tiempo. Si el dispositivo está conectado a Internet y tiene una tarjeta SIM, las sugerencias se generan tanto mediante NTP (red) como NITZ (telefonía). En este caso de prueba, solo la sección 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 configura según el orden de las fuentes horarias en la lista de prioridades en la clave config_autoTimeSourcesPriority . Sin embargo, las sugerencias de una fuente de mayor prioridad pueden ignorarse 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 se cambiará. En este caso de prueba, siempre que las sugerencias no estén desactualizadas, el reloj del sistema se configura usando una de las sugerencias del Telephony suggestion history .

El siguiente es un ejemplo de una salida en la que el dispositivo recurre a 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 como comparación con la salida en el escenario de prueba, el siguiente es un ejemplo de una salida típica donde el dispositivo recibe sugerencias de tiempo de 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}