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 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 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'effet 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 minimiser la quantité d'énergie consommée. Lorsqu'elle est entièrement active, la radio sans fil consomme beaucoup d'énergie, mais lorsqu'elle est inactive ou en veille, elle en consomme très peu.

N'oubliez pas que la radio ne peut pas passer de l'état de 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 d'un état de charge élevé à un état de charge faible afin d'économiser de l'énergie lorsqu'elle n'est pas utilisée, tout en essayant de minimiser la latence associée à l'activation de la radio.

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

  • Pleine puissance : utilisée lorsqu'une connexion est active, ce qui permet à l'appareil de transférer des données à la vitesse la plus élevée possible.
  • Économie d'énergie : état intermédiaire qui réduit la consommation 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 de veille et de veille prolongée consomment beaucoup moins de batterie, ils introduisent également une latence importante pour les requêtes réseau. Il faut environ 1,5 seconde pour que l'appareil retrouve sa pleine puissance après avoir été en mode basse consommation, et plus de deux secondes pour qu'il passe du mode veille à sa pleine puissance.

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


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

La machine à états radio de 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.). Ils 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 une latence indésirable pendant que les utilisateurs naviguent sur le Web. La durée de queue relativement faible garantit également qu'une fois une session de navigation terminée, la radio peut passer à un état de consommation d'énergie plus faible.

Malheureusement, cette approche peut entraîner des applications inefficaces sur les systèmes d'exploitation de smartphones modernes 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 privilégiée).

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 à états radio 3G typique décrite précédemment, elle restera à pleine puissance pendant toute la durée de votre transfert, plus 5 secondes supplémentaires de temps de queue, suivies de 12 secondes à l'état de faible consommation d'énergie. Ainsi, pour un appareil 3G typique, chaque session de transfert de données entraînera une consommation d'énergie par 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 à haute puissance juste au moment où elle entre en mode veille.


Figure 2 : Utilisation relative de la puissance radio sans fil pour un transfert d'une seconde exécuté trois fois par minute. La latence "power up" entre les exécutions est exclue de la figure.

En comparaison, si la même application regroupait ses transferts de données en exécutant un seul transfert de trois secondes par minute, la radio resterait en état de haute puissance pendant seulement 20 secondes par minute. Cela permettrait à la radio d'être en veille pendant 40 secondes de chaque minute, ce qui réduirait considérablement la consommation de la batterie.


Figure 3 : Utilisation relative de la puissance radio sans fil pour les transferts de trois secondes exécutés une fois par minute.

Techniques d'optimisation

Maintenant que vous comprenez comment l'accès au réseau affecte l'autonomie de la batterie, parlons de 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 sûr, 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. Pour éviter cela, vous pouvez anticiper et prérécupérer 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 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érécupérer des données

Le préchargement des 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, celle-ci 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 fois, sur une seule connexion, à pleine capacité.

En transférant vos données à l'avance, vous réduisez le nombre d'activations radio nécessaires pour les télécharger. Vous économisez ainsi la batterie, mais vous améliorez également la latence, réduisez la bande passante requise et diminuez les temps de téléchargement.

La prélecture améliore également l'expérience utilisateur en minimisant 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 téléchargeant les titres uniquement après la sélection d'une catégorie, les articles complets uniquement lorsque l'utilisateur souhaite les lire et les miniatures uniquement lorsqu'elles apparaissent à l'écran.

Avec cette approche, la radio est forcée de rester active pendant la majeure partie de la session de lecture d'actualités des utilisateurs, lorsqu'ils parcourent les titres, changent de catégorie et lisent des articles. De plus, le passage constant d'un état énergétique à un autre 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 (pour garantir un temps de démarrage à faible latence), puis en continuant avec les titres et miniatures restants, ainsi que le texte de chaque article disponible à partir d'au moins la liste des titres principaux.

Une autre solution consiste à précharger chaque titre, miniature, texte d'article et éventuellement même les images d'article complet, 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 batterie importantes pour télécharger du contenu qui n'est jamais utilisé. Elle doit donc être mise en œuvre avec prudence.

Facteurs supplémentaires

Bien que la prélecture des données présente de nombreux avantages, une utilisation trop agressive peut également entraîner une augmentation de la consommation de la batterie et de la bande passante, ainsi que du 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 la prélecture ne retarde pas le démarrage de l'application pendant que celle-ci attend la fin de la prélecture. Concrètement, cela peut signifier le traitement progressif des données ou le lancement de transferts consécutifs prioritaires, de sorte que les données requises pour le démarrage de l'application soient téléchargées et traitées en premier.

L'agressivité avec laquelle vous préchargez les données dépend de la taille des données téléchargées et de la probabilité qu'elles soient utilisées. Pour vous donner une idée, en vous basant sur la machine à états décrite précédemment, pour les données qui ont 50 % de chances d'être utilisées au cours de la session utilisateur actuelle, vous pouvez généralement précharger pendant environ six secondes (environ un à deux mégaoctets) avant que le coût potentiel du téléchargement de données inutilisées ne corresponde aux économies potentielles de ne pas télécharger ces données au départ.

En règle générale, il est recommandé de précharger les données de sorte que vous n'ayez besoin de lancer un autre téléchargement que toutes les deux à cinq minutes, et pour une taille de l'ordre de un à cinq mégaoctets.

En suivant ce principe, les téléchargements volumineux, tels que les fichiers vidéo, doivent être effectués par blocs à intervalles réguliers (toutes les deux à cinq minutes). Cela permet de précharger uniquement les données vidéo susceptibles d'être visionnées dans les prochaines minutes.

Une solution consiste à planifier le téléchargement complet pour qu'il ne se produise que lorsque l'appareil est connecté au Wi-Fi et, éventuellement, uniquement lorsqu'il est en charge. L'API WorkManager prend en charge exactement ce cas d'utilisation, en vous permettant 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'envoyer 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 initié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 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 une recherche. La demande peut ensuite être planifiée et exécutée par lot avec d'autres demandes lorsqu'une connexion est établie.

Regrouper des connexions

En plus du traitement par lot et de la prélecture, une autre stratégie peut vous aider : la mise en pool des connexions réseau de votre application.

Il est généralement plus efficace de réutiliser les connexions réseau existantes que d'en initier 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

Dans cette section, vous avez beaucoup appris sur la radio sans fil et sur 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 la consommation de la batterie.

Dans la section suivante, nous examinerons en détail trois types distincts d'interactions réseau courants dans la plupart des applications. Vous découvrirez les facteurs de chacun de ces types, ainsi que les techniques et API modernes permettant de gérer efficacement ces interactions.