Détection de l'heure du réseau

Les appareils Android tentent automatiquement d'obtenir l'heure Unix correcte à partir d'une source réseau. Android utilise le protocole SNTP, qui utilise le protocole UDP, pour obtenir des informations temporelles.

Les composants décrits sur cette page font partie du système de détection automatique de l'heure appelé origine horaire du réseau . Un signal horaire provenant d'un serveur de temps réseau peut être utilisé pour régler l'horloge système de l'appareil Android lorsque la détection automatique de l'heure est prise en charge sur l'appareil et que le service time_detector est configuré pour l'utiliser.

Par défaut, Android utilise l’origine horaire du réseau comme origine principale de détection automatique de l’heure.

Système de détection de temps réseau

Le service network_time_update_service qui s'exécute sur le serveur système Android implémente le système de détection de l'heure réseau. Le service utilise périodiquement SNTP pour obtenir un signal horaire d'un serveur. Le service surveille également la connectivité réseau et déclenche une actualisation de l'heure lorsqu'aucun signal horaire récent n'est disponible après de longues périodes de mauvaise connectivité.

Le service network_time_update_service tente d'obtenir un signal horaire après le démarrage et lorsque la connectivité réseau est établie pour la première fois. Le service essaie ensuite de conserver à jour le dernier signal qu’il détient. Il équilibre les besoins des appareils Android individuels avec la charge substantielle qui pourrait être générée par de nombreux appareils Android dans le monde entier pour rafraîchir leur temps.

À l'aide d'API internes, network_time_update_service soumet des suggestions d'heure réseau au service time_detector . D'autres composants de la plate-forme Android utilisent ensuite ces suggestions d'heure réseau.

Après avoir reçu des suggestions de l'origine horaire du réseau, le service time_detector détermine s'il convient de mettre à jour l'horloge système conformément aux règles de priorisation configurées.

Pour configurer le système de détection automatique de l'heure afin d'utiliser les suggestions d'origine du réseau pour régler automatiquement l'horloge système, utilisez le fichier de configuration du serveur système core/res/res/values/config.xml . Assurez-vous que le network de valeurs est contenu dans config_autoTimeSourcesPriority à la position souhaitée. Pour plus de détails, voir Priorité de la source de temps .

Configuration de l'appareil

Cette section décrit comment les fabricants d'appareils peuvent configurer le système de détection de l'heure du réseau.

La configuration de base AOSP se trouve dans frameworks/base/core/res/res/values/config.xml :

Clé de configuration Valeur AOSP Description
config_ntpRetry 3 Après l'échec de l'actualisation, il s'agit du nombre de fois où le système tente d'interroger l'heure du réseau avec un intervalle d'interrogation NTP plus court ( config_ntpPollingIntervalShorter ), avant d'annuler et d'utiliser l'intervalle d'interrogation normal ( config_ntpPollingInterval ). Une valeur inférieure à 0 signifie que le système réessaye d'interroger à l'intervalle d'interrogation NTP le plus court jusqu'à ce qu'il puisse s'actualiser avec succès.
config_ntpPollingInterval 64800000 (18 heures) L'intervalle d'interrogation normal du réseau en millisecondes.
config_ntpPollingIntervalShorter 60000 (1 minute) Intervalle d’interrogation du temps de nouvelle tentative du réseau en millisecondes. Utilisé lorsqu'une actualisation de l'heure échoue.
config_ntpServers Une seule entrée : ntp://time.android.com Serveurs NTP à utiliser pour obtenir une heure précise. Les éléments doivent être au format : ntp://<host>[:port] .
Il ne s'agit pas d'un système d'URI IANA enregistré.
config_ntpTimeout 5000 Temps d'attente d'une réponse du serveur NTP en millisecondes avant l'expiration du délai.

Les serveurs

Par défaut, AOSP utilise les serveurs de temps time.android.com , qui est un alias pour Google Public NTP . Ce service n'a pas de SLA. Pour plus de détails, consultez la FAQ Google Public NTP .

Prise en charge de plusieurs serveurs

Pour Android 14 et versions ultérieures, le framework prend en charge plusieurs serveurs NTP. Cela prend en charge les situations dans lesquelles les appareils sont distribués dans le monde entier avec une configuration unique, mais où l'accès aux serveurs tels que time.android.com est restreint à certains endroits.

L'algorithme essaie chaque serveur spécifié dans la clé de configuration config_ntpServers . Lorsqu'il en trouve un qui répond, le système continue d'utiliser ce serveur jusqu'à ce que l'actualisation échoue ou que le périphérique redémarre.

Précision

La synchronisation de l'heure réseau par défaut d'Android utilise SNTP avec une seule requête horaire environ une fois par jour pour essayer de garantir qu'elle dispose toujours d'un signal horaire récent.

Les effets de latence du réseau sont le principal contributeur à l'imprécision temporelle liée à la mise en œuvre du SNTP d'Android. SNTP suppose des délais de réseau symétriques, c'est-à-dire que la latence du réseau pour la demande est la même que la latence du réseau pour la réponse, et l'heure correcte se situe exactement au milieu de cet aller-retour du réseau. Souvent, le temps d'aller-retour sur le réseau est de l'ordre de quelques centaines de millisecondes et sur un réseau câblé, la latence est presque symétrique, ce qui entraîne des niveaux d'imprécision presque imperceptibles pour les utilisateurs. Cependant, avec la téléphonie mobile ou radio, il existe plusieurs étapes au cours desquelles des délais asymétriques relativement longs peuvent être insérés dans une transaction réseau, conduisant à une plus grande imprécision.

Avec le paramètre par défaut AOSP pour config_ntpTimeout défini sur 5000 millisecondes, et si toute la latence du réseau est uniquement concentrée sur le segment entrant ou sortant, l'erreur théorique maximale est d'environ 2,5 secondes.

La précision globale de l'horloge du système est également affectée par la capacité de l'appareil Android à suivre avec précision le temps écoulé après l'obtention d'un signal horaire. Il s'agit d'un problème lié à toute la chronométrage sur Android, pas seulement à la détection de l'heure du réseau, et c'est pourquoi le service time_detector ne tient pas compte des anciennes suggestions d'heure. Le service network_time_update_service s'actualise régulièrement à l'aide de l'intervalle config_ntpPollingInterval pour que le service time_detector soit fourni avec de nouvelles suggestions d'heure et pour garantir que le service time_detector ne retombe pas sur des origines temporelles de priorité inférieure et souvent de moindre précision ou parfois incorrectes, telles que telephony .

Lorsque la détection automatique de l'heure est utilisée, la précision de l'horloge système de l'appareil peut être affectée par d'autres configurations du service time_detector , telles que les constantes et les indicateurs qui affectent la différence entre une suggestion d'heure et l'heure actuelle de l'horloge système avant que l'horloge ne soit ajustée ( ServiceConfigAccessorImpl.java ).

Les fabricants d'appareils peuvent modifier la précision à l'aide des options de configuration et des constantes précédentes. Mais il est important d'être conscient des limites de la mise en œuvre SNTP de la plate-forme et de l'impact potentiel sur la consommation d'énergie d'opérations réseau plus fréquentes, de l'impact sur les applications exécutées sur l'appareil en raison d'ajustements d'horloge plus fréquents mais plus petits, et de l'effet sur la charge du serveur.

Autres utilisations du temps réseau

Si la détection automatique de l'heure à l'aide de l'origine network n'est pas configurée ou si l'utilisateur a désactivé la détection automatique de l'heure, l'heure obtenue par le service network_time_update_service est toujours utilisée par les composants suivants :

  • La méthode SystemClock.currentNetworkTimeClock() .
  • Fonctions internes de la plateforme. Par exemple, A-GPS peut localiser un premier point GNSS (emplacement) plus rapidement lorsqu'il dispose d'informations sur l'heure du réseau.

Débogage et tests

La section suivante décrit les commandes shell permettant de déboguer et de tester la fonctionnalité de détection de l'heure réseau.

Interagissez avec le service network_time_update_service

Pour vider l'état actuel de network_time_update_service , utilisez :

adb shell cmd network_time_update_service dump

Pour voir un ensemble d'options de ligne de commande pouvant vous aider lors des tests, utilisez :

adb shell cmd network_time_update_service help