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