Priorité de la source horaire

Le framework Android utilise diverses sources de temps pour la synchronisation de l'heure. Cette page se concentre sur les sources horaires automatiques Network Time Protocol (NTP) et Network Identity and Time Zone (NITZ). Par défaut dans Android 12 ou version ultérieure, le framework donne la priorité à NTP comme source de temps par rapport à NITZ, car NTP est plus précis et fiable que NITZ. Dans les situations où NTP n'est pas disponible, le framework s'appuie sur NITZ. Il s'agit d'une inversion de la priorité par défaut des versions antérieures de la plateforme. Par défaut dans Android 11 et versions antérieures, le framework donne la priorité à NITZ par rapport à NTP.

Pour plus de détails sur cette modification, consultez les correctifs AOSP suivants : 1563678 , 1513323 .

Configuration de la priorité de la source de temps

Pour configurer quelle source de temps est prioritaire par défaut pour une version spécifique d'Android, configurez la clé config_autoTimeSourcesPriority dans frameworks/base/core/res/res/values/config.xml au moment de la construction. Les suggestions de temps provenant de la source de temps située en haut de la liste ont priorité sur les sources situées en bas de la liste.

Les sources de temps Android pouvant être configurées se trouvent dans TimeDetectorStrategy.java . Les sources suivantes sont configurées pour être utilisées par défaut :

  • Téléphonie (NITZ)
  • Réseau (NTP)

Essai

Pour vérifier que l'appareil utilise NITZ lorsque NTP n'est pas disponible (lorsque les données mobiles et le Wi-Fi sont désactivés), procédez comme suit :

  1. Assurez-vous qu'il y a une carte SIM fonctionnelle dans le DUT
  2. Désactivez les données mobiles et le Wi-Fi
  3. Mettez l'appareil en mode avion pour vous assurer que la radio cellulaire est éteinte
  4. Désactiver la détection automatique de l'heure
  5. Réglez l'horloge manuellement sur une valeur horaire incorrecte à l'avenir
  6. Redémarrez l'appareil
  7. Activer la détection automatique de l'heure
  8. Sortez l'appareil du mode avion

Ces étapes déclenchent une modification de l'horloge système dès qu'un signal NITZ est reçu. Pour vérifier comment l'heure de l'appareil est définie, exécutez la commande suivante :

adb shell dumpsys time_detector

Pour vérifier que l'horloge système utilise NITZ, confirmez ce qui suit dans le résultat de la commande :

  • mEnvironment.isAutoTimeDetectionEnabled() est true .
  • mEnvironment.autoOriginPriorities() contient une liste de sources temporelles, les sources situées en haut de la liste ayant priorité sur les sources situées en bas de la liste.
  • La section Time change log montre que l'horloge système est réglée à l'aide d'une suggestion téléphonique.
  • La section Telephony suggestion history contient des suggestions d'heure.
  • La section Network suggestion history est vide.

Les suggestions temporelles dans les sections Telephony suggestion history et Network suggestion history sont considérées comme la source de vérité pour le temps. Si l'appareil est connecté à Internet et dispose d'une carte SIM, les suggestions sont générées à la fois via NTP (réseau) et NITZ (téléphonie). Dans ce scénario de test, seule la section Telephony suggestion history contient des suggestions car NTP est désactivé.

La section Time change log enregistre les modifications apportées à l'horloge système de l'appareil et la suggestion utilisée. L'horloge système est définie en fonction de l'ordre des sources de temps dans la liste de priorités dans la clé config_autoTimeSourcesPriority . Cependant, les suggestions provenant d'une source de priorité plus élevée peuvent être ignorées si elles sont trop anciennes ou non valides. De plus, si la suggestion valide de priorité la plus élevée correspond à l'heure actuelle de l'horloge système de l'appareil à quelques secondes près, l'heure ne sera pas modifiée. Dans ce scénario de test, tant que les suggestions ne sont pas obsolètes, l'horloge système est réglée à l'aide de l'une des suggestions de l' Telephony suggestion history .

Ce qui suit est un exemple de sortie dans laquelle le périphérique utilise NITZ lorsque NTP n'est pas 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}

À titre de référence et de comparaison avec la sortie du scénario de test, voici un exemple de sortie typique dans laquelle l'appareil reçoit des suggestions d'heure des sources horaires NTP et 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}