Détection de l'heure du réseau

Les appareils Android tentent automatiquement d'obtenir la bonne heure de l'époque Unix à partir de 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 de la fonctionnalité de détection automatique de l'heure système appelé origine de l'heure du réseau. Un signal horaire de un serveur de temps réseau peut être utilisé pour définir l'horloge système d'un appareil Android lorsque la détection automatique de l'heure est prise en charge sur l'appareil et le time_detector service est configuré pour l'utiliser.

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

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

Le service network_time_update_service qui s'exécute sur le serveur système Android met en œuvre le système de détection de l'heure du réseau. Le service utilise régulièrement SNTP pour obtenir un signal temporel d'un serveur. Le service surveille également le réseau et déclenche une actualisation de l'heure lorsqu'aucun signal d'heure récente 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 lorsque la connectivité réseau est établie pour la première fois. La service essaie ensuite de conserver le dernier signal qu'il détient. Il équilibre des appareils Android avec la charge importante pouvant être générées par de nombreux appareils Android du monde entier rafraîchissent leur temps.

À l'aide d'API internes, network_time_update_service envoie l'heure du réseau des suggestions au service time_detector. Autre plate-forme Android les composants, puis utilisent ces suggestions de temps réseau.

Après avoir reçu des suggestions de l'origine de l'heure du réseau, time_detector détermine si l'horloge système doit être mise à jour en fonction configuré des règles de priorisation.

Pour configurer le système de détection automatique de l'heure afin qu'il utilise l'origine du réseau pour régler l'horloge système automatiquement, utilisez le Fichier de configuration du serveur système core/res/res/values/config.xml. Vérifiez que le paramètre la valeur network est contenue dans config_autoTimeSourcesPriority au niveau la position de votre annonce. Pour en savoir plus, consultez Priorité de la source :

Configuration de l'appareil

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

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 Nombre de tentatives d'actualisation après l'échec de l'actualisation interrogation de temps réseau avec un intervalle d'interrogation NTP plus court (config_ntpPollingIntervalShorter), avant de sauvegarder et d'utiliser l'intervalle d'interrogation normal (config_ntpPollingInterval). Une valeur inférieur à 0 signifie que le système retente d'interroger le NTP le plus court jusqu'à ce qu'il puisse être actualisé.
config_ntpPollingInterval 64800000 (18 heures) Intervalle d'interrogation de temps réseau normal, en millisecondes.
config_ntpPollingIntervalShorter 60000 (1 minute) Intervalle d'interrogation de temps réseau en millisecondes. Utilisé lorsque l'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 suivant: ntp://<host>[:port]
Il ne s'agit pas d'un schéma d'URI IANA enregistré. <ph type="x-smartling-placeholder">
config_ntpTimeout 5000 Délai d'attente de la réponse du serveur NTP (en millisecondes) avant le délai d'expiration.

Serveurs

Par défaut, AOSP utilise des serveurs de temps à time.android.com, qui est un alias pour Google Public NTP : Ce service a sans contrat de niveau de service. Pour en savoir plus, consultez les Questions fréquentes sur le protocole public NTP de Google

Compatibilité avec plusieurs serveurs

Pour Android 14 et versions ultérieures, le framework est compatible avec plusieurs serveurs NTP. Cela fonctionne dans les cas où les appareils distribuées dans le monde entier avec une seule configuration, mais où l'accès aux serveurs comme time.android.com, est limité dans certains endroits.

L'algorithme essaie chaque serveur spécifié dans le config_ntpServers. clé de configuration. Lorsqu'il en trouve une qui répond, le système continue d'utiliser ce serveur jusqu’à ce qu’il ne s’actualise pas 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 environ une fois par jour pour essayer de s'assurer qu'il dispose toujours d'un signal d'heure récent.

Les effets de latence du réseau sont le plus grand facteur d'imprécision du temps l'implémentation SNTP d'Android. SNTP suppose des retards réseau symétriques, c'est-à-dire la latence du réseau pour la requête est identique à celle du réseau pour le et l'heure correcte se trouve au milieu aller-retour sur le réseau. Souvent, le délai aller-retour sur le réseau est de l'ordre de quelques de 100 millisecondes et sur un réseau câblé, la latence est proche de ce qui conduit à des niveaux d'imprécision quasi imperceptibles pour utilisateurs. Cependant, avec la téléphonie mobile ou radio, il y a plusieurs étapes où des retards relativement longs et asymétriques peuvent être insérés dans une transaction réseau ce qui conduit à plus d'inexactitude.

Avec le paramètre AOSP par défaut pour config_ntpTimeout défini sur 5000 millisecondes, et si toute la latence du réseau est concentrée uniquement sur le trafic 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 pour suivre avec précision le temps écoulé après l'obtention d'un signal de temps. Il s'agit d'un concerne l'ensemble du temps sur Android, pas seulement la détection de l'heure du réseau, pourquoi le service time_detector ignore les suggestions d'anciennes dates. La Le service network_time_update_service est actualisé régulièrement à l'aide de la Intervalle de config_ntpPollingInterval pour conserver le service time_detector avec de nouvelles suggestions d'horaires et pour vous assurer que time_detector ne retombe pas à une priorité inférieure et souvent Il peut arriver que des origines temporelles soient 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ées par d'autres configurations du service time_detector, telles que constantes et options qui affectent l'écart entre une suggestion d'horaire et l'heure actuelle de l'horloge système avant l'ajustement de l'horloge (ServiceConfigAccessorImpl.java).

Les fabricants d'appareils peuvent modifier la précision à l'aide de la configuration précédente des options et des constantes. Mais il est important de connaître les limites la mise en œuvre SNTP de la plate-forme et 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 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é par les composants suivants:

  • La SystemClock.currentNetworkTimeClock() .
  • Fonctions internes de la plate-forme. Par exemple, A-GPS peut localiser un GNSS (position) d’abord résoudre plus rapidement lorsqu’il dispose d’informations de temps du réseau.

Débogage et test

La section suivante décrit les commandes shell permettant de déboguer et de tester les de détection de l'heure du 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 faciliter les tests, utilisez:

adb shell cmd network_time_update_service help