Détection du temps 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 sur l'heure.

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 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 de l'heure réseau comme origine principale de la détection automatique de l'heure.

Système de détection de l'heure réseau

Le service network_time_update_service qui s'exécute 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 le protocole 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 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 tente ensuite de maintenir à jour 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 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 temporelle du réseau, le service time_detector détermine s'il faut 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 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 à la position souhaitée. Pour en savoir plus, consultez 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 se trouve à l'adresse 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 réseau avec un intervalle d'interrogation NTP plus court (config_ntpPollingIntervalShorter), avant de revenir à l'intervalle d'interrogation normal (config_ntpPollingInterval). Une valeur inférieure à 0 signifie que le système réessaie l'interrogation à l'intervalle d'interrogation NTP plus court jusqu'à ce qu'il puisse actualiser correctement.
config_ntpPollingInterval 64800000 (18 heures) Intervalle normal d'interrogation de l'heure réseau en millisecondes.
config_ntpPollingIntervalShorter 60000 (1 minute) Intervalle d'interrogation du réseau pour la nouvelle tentative, en millisecondes. Utilisé en cas d'échec de l'actualisation de l'heure.
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].
Ce n'est pas un schéma d'URI IANA enregistré.
config_ntpTimeout 5000 Délai d'attente d'une réponse du serveur NTP en millisecondes avant expiration du délai.

Serveurs

Par défaut, AOSP utilise les serveurs temporels time.android.com, qui sont un alias pour Google Public NTP. Aucun contrat de niveau de service n'est associé à ce 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 est compatible avec plusieurs serveurs NTP. Cela permet de gérer les situations où les appareils sont distribués à l'échelle mondiale 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 seule requête d'heure environ une fois par jour pour essayer de s'assurer qu'elle dispose toujours d'un signal horaire récent.

Les effets de la latence réseau sont les principaux facteurs d'imprécision temporelle avec l'implémentation SNTP d'Android. SNTP suppose des délais réseau symétriques, c'est-à-dire que la latence réseau pour la requête est la même que celle pour la réponse, et que l'heure correcte se situe exactement au milieu de ce trajet réseau aller-retour. Souvent, le temps d'aller-retour du réseau est de l'ordre de quelques centaines de millisecondes. 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. Toutefois, avec la téléphonie mobile ou radio, plusieurs étapes peuvent insérer des délais asymétriques relativement longs dans une transaction réseau, ce qui entraîne une plus grande imprécision.

Avec le paramètre AOSP par défaut pour config_ntpTimeout défini sur 5000 millisecondes, et si toute la latence réseau est uniquement concentrée sur la partie entrante ou sortante, 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 horaire. Cela concerne toute la gestion du temps sur Android, et pas seulement la détection de l'heure réseau. C'est pourquoi le service time_detector ignore les 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 dispose de suggestions d'heures récentes et pour s'assurer que le service time_detector ne revienne pas à des origines temporelles de priorité inférieure, souvent moins précises, voire 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 déterminent 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 et des constantes 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 des opérations réseau plus fréquentes, l'impact sur les applications exécutées sur l'appareil des 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, l'A-GPS peut localiser plus rapidement une première correction GNSS (position) lorsqu'il dispose d'informations sur l'heure 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, utilisez 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 la commande suivante :

adb shell cmd network_time_update_service help