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 les sources de temps automatiques NTP (Network Time Protocol) et NITZ (Network Time 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 action inverse la priorité par défaut des versions antérieures de la plate-forme. Par défaut, sous Android 11 et versions antérieures, le framework donne la priorité à NITZ à NTP.

Pour en savoir plus sur cette modification, consultez les correctifs AOSP suivants : 1563678, 1513323.

Configurer la priorité des sources temporelles

Pour configurer la source temporelle prioritaire par défaut pour une version d'Android spécifique, configurez la clé config_autoTimeSourcesPriority dans frameworks/base/core/res/res/values/config.xml au moment de la compilation. Les suggestions de temps issues de la source temporelle la plus élevée dans la liste sont prioritaires sur les 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

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. 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 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 le NITZ, vérifiez les points suivants dans le résultat de la commande:

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

Les suggestions d'heure dans les sections Telephony suggestion history et Network suggestion history sont considérées comme la source de référence 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 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 à 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 des priorités de la clé config_autoTimeSourcesPriority. Toutefois, les suggestions provenant d'une source de priorité supérieure peuvent être ignorées si elles sont trop anciennes ou non valides. De plus, si la suggestion valide ayant la priorité la plus élevée correspond à l'heure actuelle de l'horloge système de l'appareil en 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éfinie à 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}

À titre de comparaison avec la sortie du scénario de test, vous trouverez ci-dessous un exemple de sortie type dans laquelle l'appareil reçoit des suggestions d'heure 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}