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 les sources de temps automatiques NITZ (Network Identity and Time Zone). Par défaut, dans Android 12 ou version ultérieure, le framework donne la priorité au protocole NTP comme source de temps par rapport à NITZ, car il est plus précis et fiable. Dans les situations où le protocole NTP n'est pas disponible, le framework revient à 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 au protocole NTP.
Pour en savoir plus sur cette modification, consultez les correctifs AOSP suivants : 1563678, 1513323.
Configurer la priorité de la source de temps
Pour configurer la source de temps qui est prioritaire par défaut pour une version Android
spécifique, configurez la
config_autoTimeSourcesPriority
clé dans frameworks/base/core/res/res/values/config.xml au moment de la compilation. Les suggestions de temps provenant de la source de temps qui se trouve en haut de la liste sont prioritaires par rapport aux sources qui se trouvent plus bas dans la liste.
Les sources de temps Android qui peuvent ê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 le protocole NTP n'est pas disponible (lorsque les données mobiles et le Wi-Fi sont désactivés), procédez comme suit :
- Assurez-vous qu'une carte SIM fonctionnelle est insérée dans l'appareil testé.
- Désactivez les données mobiles et le Wi-Fi.
- Mettez l'appareil en mode Avion pour vous assurer que la cellule GSM est désactivée.
- Désactivez la détection automatique de l'heure.
- Réglez manuellement l'horloge sur une valeur de temps incorrecte dans le futur.
- Redémarrez l'appareil.
- Activez la détection automatique de l'heure.
- Désactivez le 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_detectorPour vérifier que l'horloge système utilise NITZ, confirmez les éléments suivants dans la sortie de la commande :
mEnvironment.isAutoTimeDetectionEnabled()esttrue.mEnvironment.autoOriginPriorities()contient une liste de sources de temps, les sources en haut de la liste étant prioritaires par rapport à celles qui se trouvent plus bas dans la liste.- La section
Time change logindique que l'horloge système est réglée à l'aide d'une suggestion de téléphonie. - La section
Telephony suggestion historycontient des suggestions de temps. - La section
Network suggestion historyest vide.
Les suggestions de temps 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 du protocole NTP (réseau) et de NITZ (téléphonie). Dans ce cas de test, seule la section Telephony suggestion history contient des suggestions, car le protocole 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 réglée en fonction de l'ordre des sources de temps dans la liste de priorité de la clé config_autoTimeSourcesPriority. Toutefois, les suggestions 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 la plus prioritaire 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 réglée à l'aide de l'une des suggestions de l'historique des suggestions de téléphonieTelephony suggestion history.
Voici un exemple de sortie dans laquelle l'appareil revient à l'utilisation de NITZ lorsque le protocole 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, voici un exemple de sortie typique dans laquelle l'appareil reçoit des suggestions de temps à partir 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}