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 de l'heure réseau. Un signal temporel provenant d'un serveur de temps réseau peut être utilisé pour définir 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 de l'heure réseau comme origine principale de la détection automatique de l'heure.

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

Le service network_time_update_service exécuté dans le serveur système Android implémente le système de détection de l'heure réseau. Le service utilise régulièrement SNTP pour obtenir un signal temporel à partir d'un serveur. Le service surveille également la connectivité réseau et déclenche une actualisation de l'heure lorsqu'aucun signal temporel 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 temporel après le démarrage et lors de la première connexion réseau. Le service essaie ensuite de conserver le dernier signal qu'il détient. Il équilibre les besoins des appareils Android individuels avec la charge importante qui pourrait être générée par de nombreux appareils Android dans le monde entier en actualisant leur heure.

À l'aide d'API internes, network_time_update_service envoie 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 de l'heure réseau, le service time_detector détermine s'il doit mettre à jour l'horloge système en fonction des règles de priorisation configurées.

Pour configurer le système de détection automatique de l'heure afin qu'il utilise 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 la valeur network est contenue dans config_autoTimeSourcesPriority à l'emplacement souhaité. Pour en savoir plus, consultez la section Priorité de la source temporelle.

Configuration de l'appareil

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

La configuration AOSP de base est la suivante : frameworks/base/core/res/res/values/config.xml :

Clé de configuration Valeur AOSP Description
config_ntpRetry 3 Après un échec d'actualisation, il s'agit du nombre de fois où le système tente d'interroger l'heure réseau avec un intervalle d'interrogation NTP plus court (config_ntpPollingIntervalShorter), avant de revenir en arrière et d'utiliser l'intervalle d'interrogation normal (config_ntpPollingInterval). Une valeur inférieure à 0 signifie que le système réessaie l'interrogation avec un intervalle d'interrogation NTP plus court jusqu'à ce qu'il puisse effectuer l'actualisation.
config_ntpPollingInterval 64800000 (18 heures) Intervalle de sondage de l'heure réseau normal, en millisecondes.
config_ntpPollingIntervalShorter 60000 (1 minute) Intervalle de sondage de l'heure réseau en millisecondes. Utilisé en cas d'échec d'une actualisation temporelle.
config_ntpServers Une seule entrée: ntp://time.android.com Serveurs NTP à utiliser pour obtenir une heure précise. Les éléments doivent se présenter sous la forme suivante : ntp://<host>[:port].
Il ne s'agit pas d'un schéma d'URI IANA enregistré.
config_ntpTimeout 5000 Délai d'attente de la réponse d'un serveur NTP en millisecondes avant expiration du délai.

Serveurs

Par défaut, AOSP utilise des serveurs de temps sur time.android.com, qui est un alias de Google Public NTP. Ce service ne dispose d'aucun contrat de niveau de service. Pour en savoir plus, consultez les questions fréquentes sur le serveur NTP public de Google.

Compatibilité avec plusieurs serveurs

Pour Android 14 et versions ultérieures, le framework accepte plusieurs serveurs NTP. Cela permet de prendre en charge les situations où les appareils sont distribués dans le monde entier avec une seule configuration, mais où l'accès aux serveurs tels que time.android.com est limité dans 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 qu'il ne parvienne plus à l'actualiser ou que l'appareil redémarre.

 Précision

La synchronisation de l'heure du réseau par défaut d'Android utilise SNTP avec une requête unique une fois par jour environ pour essayer de toujours disposer d'un signal d'heure récent.

Les effets de la latence réseau sont les principaux facteurs de l'inexactitude de l'heure avec l'implémentation SNTP d'Android. SNTP suppose des retards réseau symétriques, c'est-à-dire que la latence du réseau pour la requête est identique à celle du réseau pour la réponse, et que l'heure correcte se trouve exactement au milieu de cet aller-retour réseau. Souvent, la durée aller-retour du réseau est de l'ordre de quelques centaines de millisecondes. Sur un réseau filaire, la latence est presque symétrique, ce qui entraîne des niveaux d'inexactitude presque imperceptibles pour les utilisateurs. Toutefois, avec la téléphonie mobile ou radio, il existe plusieurs étapes où des retards asymétriques relativement longs peuvent être insérés dans une transaction réseau, ce qui entraîne 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 réseau est concentrée uniquement sur le tronçon entrant ou sortant, l'erreur théorique maximale est d'environ 2, 5 secondes.

La précision globale de l'horloge 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 temporel. Il s'agit d'un problème lié à la gestion du temps sur Android, pas seulement à la détection de l'heure du réseau. C'est pourquoi le service time_detector ignore les suggestions d'anciennes suggestions. Le service network_time_update_service s'actualise régulièrement à l'aide de l'intervalle config_ntpPollingInterval pour fournir au service time_detector des suggestions de temps actualisées et s'assurer que le service time_detector ne revient pas à des origines temporelles de priorité inférieure, souvent moins précises 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 constantes et options de configuration précédentes. Toutefois, il est important de connaître les limites de l'implémentation SNTP de la plate-forme, ainsi que l'impact potentiel sur la consommation d'énergie d'opérations réseau plus fréquentes, l'impact sur les applications exécutées sur l'appareil d'ajustements d'horloge plus fréquents mais plus petits, et l'effet sur la charge du serveur.

Autres utilisations de l'heure 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 plate-forme Par exemple, A-GPS peut localiser plus rapidement un point GNSS (position) s'il dispose d'informations temporelles du réseau.

Débogage et test

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.

Interagir avec le service network_time_update_service

Pour vider l'état actuel de network_time_update_service, exécutez la commande suivante:

adb shell cmd network_time_update_service dump

Pour afficher un ensemble d'options de ligne de commande pouvant vous aider à effectuer des tests, utilisez:

adb shell cmd network_time_update_service help