Priorité de la source de temps

Le framework Android utilise différentes sources de temps pour la synchronisation de l'heure. Cette page se concentre sur le protocole NTP (Network Time Protocol) et Sources de temps automatiques de l'identité du réseau et du fuseau horaire (NITZ, Network Identity and Time Zone). Par défaut, sous Android 12 ou version ultérieure, le framework donne la priorité NTP comme source temporelle par rapport à NITZ, car NTP est plus précis et plus fiable que NITZ. Dans les cas où NTP n'est pas disponible, le framework fait appel à NITZ. Cette opération inverse la priorité par défaut des versions antérieures du Google Cloud. Par défaut, sous Android 11 et versions antérieures, le framework donne la priorité à NITZ via NTP.

Pour en savoir plus sur ce changement, consultez les correctifs AOSP suivants: 1563678, 1513323

Configurer la priorité des sources temporelles

Pour configurer la source temporelle prioritaire par défaut pour un appareil Android spécifique vous devez configurer config_autoTimeSourcesPriority dans frameworks/base/core/res/res/values/config.xml au moment de la compilation. Heure les suggestions de la source temporelle qui figure plus haut dans la liste sont prioritaires par rapport aux sources situées plus bas 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)

Tests

Vérifier que l'appareil utilise le 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. Vérifiez que l'appareil photo dispose d'une carte SIM opérationnelle
  2. Désactiver les données mobiles et le Wi-Fi
  3. Mettez l'appareil en mode Avion pour vous assurer que la cellule GSM est désactivée.
  4. Désactiver la détection automatique de l'heure
  5. Régler l'horloge manuellement sur une valeur future incorrecte
  6. Redémarrer l'appareil
  7. Activer la détection automatique de l'heure
  8. Quitter le mode Avion sur l'appareil

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

adb shell dumpsys time_detector

Pour vérifier que l'horloge système utilise le NITZ, vérifiez les points suivants dans la commande sortie:

  • mEnvironment.isAutoTimeDetectionEnabled() - true.
  • mEnvironment.autoOriginPriorities() contient une liste de sources de temps les sources qui figurent en haut de la liste prévalent sur celles situées plus bas. liste.
  • La section Time change log indique que l'horloge système est définie à l'aide d'un les suggestions d'appels téléphoniques.
  • La section Telephony suggestion history contient des suggestions d'horaires.
  • La section Network suggestion history est vide.

Les suggestions d'horaires dans les Telephony suggestion history et Les sections Network suggestion history sont considérées comme la source de référence pour en temps réel. Si l'appareil est connecté à Internet et qu'il est équipé d'une carte SIM, les suggestions sont générés à l'aide du réseau NTP (réseau) et du 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 aux paramètres l'horloge système et la suggestion utilisée. L'horloge système est définie en fonction l'ordre des sources de temps dans la liste des priorités la clé config_autoTimeSourcesPriority. Cependant, les suggestions d'un La source ayant une priorité plus élevée peut être ignorée si la suggestion est trop ancienne ou non valide. De plus, si la suggestion valide ayant la priorité la plus élevée correspond à l'état actuel l'heure de l'horloge système à quelques secondes, 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 défini à l'aide de l'une des suggestions de Telephony suggestion history.

Voici un exemple de sortie où l'appareil 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}

À des fins de comparaison avec les résultats du scénario de test, le Voici un exemple de sortie type dans laquelle le périphérique reçoit des suggestions d'heure provenant des sources temporelles 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}