Optimiser l'accès au réseau

L'utilisation de la radio sans fil pour transférer des données est potentiellement l'une des sources les plus importantes de décharge de la batterie de votre application. Pour minimiser la décharge de la batterie associée à l'activité réseau, il est essentiel que vous compreniez l'impact de votre modèle de connectivité sur le matériel radio sous-jacent.

Cette section présente la machine à états radio sans fil et explique comment le modèle de connectivité de votre application interagit avec elle. Il propose ensuite plusieurs techniques qui, si elles sont suivies, vous aideront à minimiser l'impact de la consommation de données de votre application sur la batterie.

Machine à états de la radio

La radio sans fil de l'appareil de votre utilisateur dispose de fonctionnalités d'économie d'énergie intégrées qui permettent de réduire la consommation d'énergie de la batterie. Lorsqu'elle est entièrement active, la radio sans fil consomme une puissance importante, mais lorsqu'elle est inactive ou en veille, elle consomme très peu d'énergie.

N'oubliez pas que la radio ne peut pas passer de la veille à l'état entièrement actif instantanément. Une période de latence est associée à l'activation de la radio. La batterie passe donc lentement des états d'énergie les plus élevés aux états d'énergie les plus faibles afin d'économiser de l'énergie lorsqu'elle n'est pas utilisée, tout en essayant de minimiser la latence associée à la mise sous tension de la radio.

La machine à états d'une radio réseau 3G typique se compose de trois états d'énergie:

  • Pleine puissance: utilisé lorsqu'une connexion est active, ce qui permet à l'appareil de transférer des données au débit le plus élevé possible.
  • Énergie faible: état intermédiaire qui réduit la consommation d'énergie de la batterie d'environ 50%.
  • Veille: état minimal de consommation d'énergie pendant lequel aucune connexion réseau n'est active.

Bien que les états "low" (faible) et "standby" (veille) déchargent beaucoup moins la batterie, ils introduisent également une latence importante dans les requêtes réseau. Le retour à la pleine puissance à partir de l'état faible prend environ 1,5 seconde, et le passage de la veille à la pleine puissance peut prendre plus de deux secondes.

Pour minimiser la latence, la machine à états utilise un délai pour retarder la transition vers des états d'énergie plus faibles. La figure 1 utilise les temps de latence d'AT&T pour une radio 3G typique.


Figure 1 : Machine à états radio sans fil 3G typique.

La machine d'état radio sur chaque appareil, en particulier le délai de transition associé ("temps de queue") et la latence de démarrage, varient en fonction de la technologie radio sans fil utilisée (3G, LTE, 5G, etc.) et sont définis et configurés par le réseau du transporteur sur lequel l'appareil fonctionne.

Cette page décrit une machine à états représentative pour une radio sans fil 3G typique, basée sur les données fournies par AT&T. Toutefois, les principes généraux et les bonnes pratiques qui en découlent s'appliquent à toutes les implémentations de radio sans fil.

Cette approche est particulièrement efficace pour la navigation Web mobile typique, car elle évite les latences indésirables lorsque les utilisateurs naviguent sur le Web. Ce délai relativement faible garantit également qu'une fois la session de navigation terminée, la radio peut passer à un état d'énergie plus faible.

Malheureusement, cette approche peut entraîner des applications inefficaces sur les systèmes d'exploitation modernes des smartphones, comme Android, où les applications s'exécutent à la fois au premier plan (où la latence est importante) et en arrière-plan (où l'autonomie de la batterie doit être prioritaire).

Impact des applications sur la machine à états de la radio

Chaque fois que vous créez une connexion réseau, la radio passe à l'état de pleine puissance. Dans le cas de la machine d'état radio 3G typique décrite précédemment, elle restera à pleine puissance pendant toute la durée de votre transfert (plus cinq secondes de temps de queue supplémentaires), suivie de 12 secondes à l'état basse consommation d'énergie. Ainsi, pour un appareil 3G standard, chaque session de transfert de données entraîne une consommation d'énergie de la radio pendant au moins 18 secondes.

En pratique, cela signifie qu'une application qui effectue un transfert de données d'une seconde, trois fois par minute, maintiendra la radio sans fil perpétuellement active, la ramenant à une puissance élevée juste au moment où elle passe en mode veille.


Figure 2 : Consommation relative de la puissance radio sans fil pour un transfert d'une seconde exécuté trois fois par minute. La figure exclut la latence de démarrage entre les exécutions.

À titre de comparaison, si la même application regroupait ses transferts de données, en exécutant un seul transfert de trois secondes toutes les minutes, la radio resterait en mode haute puissance pendant un total de 20 secondes par minute. La radio serait ainsi en veille pendant 40 secondes par minute, ce qui réduirait considérablement l'utilisation de la batterie.


Figure 3 : Consommation d'énergie radio sans fil relative pour les transferts de trois secondes exécutés une fois par minute.

Techniques d'optimisation

Maintenant que vous savez comment l'accès au réseau affecte l'autonomie de la batterie, voyons quelques mesures que vous pouvez prendre pour réduire la décharge de la batterie tout en offrant une expérience utilisateur rapide et fluide.

Transferts de données groupées

Comme indiqué dans la section précédente, l'un des meilleurs moyens d'améliorer l'efficacité de la batterie est de regrouper vos transferts de données afin de transférer moins de données.

Bien entendu, ce n'est pas toujours possible si votre application doit recevoir ou envoyer des données immédiatement en réponse à une action de l'utilisateur. Vous pouvez atténuer ce problème en anticipant et en préchargeant les données. D'autres scénarios, tels que l'envoi de journaux ou d'analyses à un serveur et d'autres transferts de données non urgents et initiés par l'application, se prêtent très bien au traitement par lot et au regroupement. Consultez Optimiser les tâches déclenchées par l'application pour obtenir des conseils sur la planification des transferts réseau en arrière-plan.

Précharger les données

Le préchargement de données est un autre moyen efficace de réduire le nombre de sessions de transfert de données indépendantes exécutées par votre application. Avec le préchargement, lorsque l'utilisateur effectue une action dans votre application, elle anticipe les données qui seront probablement nécessaires pour la prochaine série d'actions de l'utilisateur et les extrait en une seule rafale, via une seule connexion, à pleine capacité.

En chargeant vos transferts en amont, vous réduisez le nombre d'activations radio requises pour télécharger les données. Vous économisez ainsi la batterie, mais vous améliorez également la latence, réduisez la bande passante requise et réduisez les temps de téléchargement.

Le préchargement améliore également l'expérience utilisateur en réduisant la latence dans l'application causée par l'attente de la fin des téléchargements avant d'effectuer une action ou d'afficher des données.

Voici un exemple pratique.

Un lecteur d'actualités

De nombreuses applications d'actualités tentent de réduire la bande passante en ne téléchargeant les titres qu'après avoir sélectionné une catégorie, des articles complets uniquement lorsque l'utilisateur souhaite les lire et des miniatures lorsqu'ils font défiler la page jusqu'à l'affichage.

Avec cette approche, la radio doit rester active pendant la session de lecture d'actualités de la majorité des utilisateurs lorsqu'ils font défiler les titres, changent de catégorie et lisent des articles. De plus, le basculement constant entre les états de l'énergie entraîne une latence importante lors du changement de catégorie ou de la lecture d'articles.

Une meilleure approche consiste à précharger une quantité raisonnable de données au démarrage, en commençant par le premier ensemble de titres et de miniatures d'actualités (ce qui garantit un temps de démarrage à faible latence), puis en continuant avec les titres et miniatures restants, ainsi que le texte de chaque article disponible au moins dans la liste principale des titres.

Une autre solution consiste à précharger tous les titres, toutes les vignettes, le texte des articles et éventuellement des images d'articles complets, généralement en arrière-plan selon un calendrier prédéfini. Cette approche risque de consommer une bande passante et une autonomie de la batterie importantes en téléchargeant des contenus qui ne sont jamais utilisés. Elle doit donc être implémentée avec prudence.

Facteurs supplémentaires

Bien que le préchargement de données présente de nombreux avantages, utilisé de manière trop agressive, il présente également le risque d'augmenter l'épuisement de la batterie et l'utilisation de la bande passante, ainsi que le quota de téléchargement, en téléchargeant des données qui ne sont pas utilisées. Il est également important de s'assurer que le préchargement ne retarde pas le démarrage de l'application pendant que celle-ci attend la fin du préchargement. En pratique, cela peut signifier traiter les données progressivement ou lancer des transferts consécutifs prioritaires afin que les données requises pour le démarrage de l'application soient téléchargées et traitées en premier.

Le niveau d'agressivité du préchargement des données dépend de la taille des données téléchargées et de la probabilité qu'elles soient utilisées. À titre indicatif, d'après la machine à états décrite précédemment, pour les données ayant 50% de chances d'être utilisées au cours de la session utilisateur actuelle, vous pouvez généralement effectuer une précharge pendant environ six secondes (environ 1 à 2 mégaoctets) avant que le coût potentiel de téléchargement de données inutilisées ne corresponde aux économies potentielles de ne pas les télécharger.

En règle générale, il est recommandé de précharger les données afin de ne lancer qu'un autre téléchargement toutes les deux à cinq minutes, d'environ 1 à 5 Mo.

Conformément à ce principe, les téléchargements volumineux (tels que les fichiers vidéo) doivent être téléchargés par segments à intervalles réguliers (toutes les deux à cinq minutes), en préchargeant uniquement les données vidéo susceptibles d'être visionnées dans les prochaines minutes.

Une solution consiste à planifier le téléchargement complet uniquement lorsque vous êtes connecté au Wi-Fi et, éventuellement, uniquement lorsque l'appareil est en charge. L'API WorkManager prend exactement en charge ce cas d'utilisation, ce qui vous permet de limiter les tâches en arrière-plan jusqu'à ce que l'appareil réponde aux critères spécifiés par le développeur, tels que la recharge et la connexion au Wi-Fi.

Vérifier la connectivité avant d'effectuer des requêtes

La recherche d'un signal cellulaire est l'une des opérations les plus énergivores sur un appareil mobile. Pour les requêtes déclenchées par l'utilisateur, il est recommandé de vérifier d'abord la présence d'une connexion à l'aide de ConnectivityManager, comme indiqué dans la section Surveiller l'état de la connectivité et la mesure des connexions. En l'absence de réseau, l'application peut économiser la batterie en n'obligeant pas la radio mobile à effectuer de recherche. La requête peut ensuite être planifiée et exécutée en lot avec d'autres requêtes lorsqu'une connexion est établie.

Connexions de pool

En plus du traitement par lot et du préchargement, vous pouvez également regrouper les connexions réseau de votre application.

Il est généralement plus efficace de réutiliser les connexions réseau existantes que d'en créer de nouvelles. La réutilisation des connexions permet également au réseau de réagir plus intelligemment aux encombrements et aux problèmes de données réseau associés.

HttpURLConnection et la plupart des clients HTTP, tels que OkHttp, activent le regroupement de connexions par défaut et réutilisent la même connexion pour plusieurs requêtes.

Résumé et perspectives

Dans cette section, vous avez beaucoup appris sur la radio sans fil et certaines stratégies que vous pouvez appliquer à grande échelle pour offrir une expérience utilisateur rapide et réactive tout en réduisant la décharge de la batterie.

Dans la section suivante, nous allons examiner en détail trois types distincts d'interactions réseau communs à la plupart des applications. Vous découvrirez les pilotes de chacun de ces types, ainsi que les techniques et les API modernes pour gérer efficacement ces interactions.