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