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 de décharge de la batterie les plus importantes de votre application. Pour minimiser la décharge de la batterie associée à l'activité réseau, il est essentiel de comprendre comment votre modèle de connectivité affectera le matériel radio sous-jacent.

Cette section présente la machine à états de 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 à la mise sous tension 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 réduire 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:

  • Puissance maximale: utilisé lorsqu'une connexion est active, ce qui permet à l'appareil de transférer des données à la vitesse la plus élevée possible.
  • Énergie faible: état intermédiaire qui réduit la consommation d'énergie de la batterie d'environ 50%.
  • Veille: état de consommation d'énergie minimale 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 d'état 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 de l'opérateur 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. La durée de latence relativement faible garantit également qu'une fois la session de navigation terminée, la radio peut passer à un état d'énergie inférieur.

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 du 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 d'énergie radio sans fil relative 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. Cela permettrait à la radio d'être en veille pendant 40 secondes toutes les minutes, ce qui entraînerait une réduction significative de la consommation 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.

Regrouper les transferts de données

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

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 déclenché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érécupération des 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 concret.

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, les articles complets que lorsque l'utilisateur souhaite les lire et les miniatures au moment où elles s'affichent.

Avec cette approche, la radio est forcée de rester active pendant la majorité des sessions de lecture d'actualités des utilisateurs lorsqu'ils font défiler les titres, changent de catégorie et lisent des articles. De plus, le passage constant entre les états énergétiques 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 option consiste à précharger chaque titre, miniature, texte d'article et éventuellement même des images complètes d'articles, généralement en arrière-plan selon un calendrier prédéterminé. 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 qu'elle 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.

L'intensité 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 est conçue pour ce cas d'utilisation exact. Elle vous permet de limiter le travail 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 s'il existe 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 à la congestion 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 d'avenir

Dans cette section, vous avez appris beaucoup de choses sur la radio sans fil et certaines stratégies que vous pouvez appliquer de manière générale pour offrir une expérience utilisateur rapide et réactive tout en réduisant l'épuisement 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.