Priorité de la source horaire

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Le framework Android utilise diverses sources de temps pour la synchronisation de l'heure. Cette page se concentre sur les sources de temps automatiques Network Time Protocol (NTP) et Network Identity and Time Zone (NITZ). Par défaut dans Android 12 ou supérieur, 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 se rabat sur NITZ. Il s'agit d'une inversion de la priorité par défaut des versions antérieures de la plate-forme. 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 ce changement, consultez les correctifs AOSP suivants : 1563678 , 1513323 .

Configuration de la priorité de la source horaire

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 de la source de temps qui est plus élevée dans la liste ont priorité sur les sources qui sont plus basses dans 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ésactiver 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 d'heure 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 un changement 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 la sortie de la commande :

  • mEnvironment.isAutoTimeDetectionEnabled() est true .
  • mEnvironment.autoOriginPriorities() contient une liste de sources temporelles avec les sources supérieures sur la liste ayant priorité sur les sources inférieures sur la liste.
  • La section Time change log indique que l'horloge système est réglée à l'aide d'une suggestion de téléphonie.
  • La section Telephony suggestion history contient des suggestions d'heure.
  • La section Network suggestion history est vide.

Les suggestions d'heure dans les sections Historique des suggestions de Telephony suggestion history Network suggestion history sont considérées comme la source de vérité pour l'heure. Si l'appareil est connecté à Internet et dispose d'une carte SIM, les suggestions sont générées à la fois à l'aide de NTP (réseau) et de 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 Journal des 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é de la clé config_autoTimeSourcesPriority . Cependant, les suggestions d'une source de priorité plus élevée peuvent être ignorées si la suggestion est trop ancienne ou invalide. 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 où l'appareil se rabat sur l'utilisation de 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}

Pour référence en tant que comparaison avec la sortie dans le scénario de test, voici un exemple de sortie typique où l'appareil reçoit des suggestions de temps à la fois des sources de temps 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}