Priorité de la source temporelle

Le framework Android utilise différentes sources temporelles 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 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 se rabat sur NITZ. Il s'agit d'une inversion de la priorité par défaut des versions précédentes de la plate-forme. Par défaut, dans Android 11 et versions antérieures, le framework donne la priorité à NITZ par rapport à NTP.

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

Configurer la priorité de la source temporelle

Pour configurer la source de temps prioritaire par défaut pour une version 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 l'horloge figurant en haut de la liste prévalent sur celles des horloges figurant plus bas.

Les sources de temps Android configurables 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) :

  1. Assurez-vous qu'une carte SIM fonctionnelle est insérée dans l'appareil à tester.
  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 désactivée.
  4. Désactiver la détection automatique de l'heure
  5. Réglez manuellement l'horloge sur une heure incorrecte dans le futur.
  6. Redémarrer l'appareil
  7. Activer la détection automatique de l'heure
  8. Désactiver 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 NITZ, vérifiez les éléments suivants dans la sortie de la commande :

  • mEnvironment.isAutoTimeDetectionEnabled() - true.
  • mEnvironment.autoOriginPriorities() contient une liste de sources temporelles, les sources en haut de la liste ayant la priorité sur celles en bas de la liste.
  • La section Time change log indique que l'horloge système est définie à l'aide d'une suggestion de téléphonie.
  • La section Telephony suggestion history contient des suggestions d'heures.
  • 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 vérité pour l'heure. Si l'appareil est connecté à Internet et dispose d'une carte SIM, les suggestions sont générées à l'aide de NTP (réseau) et de NITZ (téléphonie). Dans ce cas de test, seule la section Telephony suggestion history contient des suggestions, car la page Nouvel onglet est désactivée.

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é de la clé config_autoTimeSourcesPriority. Toutefois, 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 cas 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 résultat dans lequel 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}

Pour référence et comparaison avec le résultat du scénario de test, voici un exemple de résultat typique dans lequel 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}