Résoudre les problèmes de réseau

Le trafic réseau généré par une application peut avoir un impact significatif sur l'autonomie de la batterie de l'appareil. Pour optimiser ce trafic, vous devez le mesurer et identifier sa source. Les requêtes réseau peuvent provenir directement d'une action de l'utilisateur, du code de votre propre application ou d'un serveur communiquant avec votre application.

Cette rubrique vous explique comment surveiller et catégoriser votre trafic réseau, et fournit des conseils sur l'identification et la résolution des problèmes.

Surveiller les requêtes à l'aide du Profileur de réseau

Utilisez le Profileur de réseau pour suivre les requêtes réseau de votre application. Vous pouvez surveiller comment et quand votre application transfère des données, et optimiser le code sous-jacent de manière appropriée.



Figure 1 : Suivez le trafic réseau. Le modèle de trafic réseau suggère que l'efficacité pourrait être considérablement améliorée en préchargeant les requêtes ou en regroupant les importations.

En surveillant la fréquence de vos transferts de données et la quantité de données transférées lors de chaque connexion, vous pouvez identifier les domaines de votre application pouvant être plus économes en batterie. Généralement, vous recherchez des pics courts qui peuvent être retardés.

Pour mieux identifier la cause des pics de transfert, l'API Traffic Stats vous permet d'ajouter des tags aux transferts de données qui se produisent à partir d'un socket dans un thread donné à l'aide de TrafficStats.setThreadStatsTag(). L'appel de cette fonction n'ajoute pas automatiquement de balises à tout le trafic d'un thread particulier. Les tags doivent être appliqués aux sockets.

Une fois le tag de thread défini, vous pouvez ajouter manuellement des tags à des sockets individuels et les supprimer à l'aide de TrafficStats.tagSocket() et TrafficStats.untagSocket(). Un tag est également appliqué si un socket est ouvert sur le thread ou si un socket serveur accepte une connexion.

L'accès simultané au même socket par plusieurs threads utilise le tag qu'il avait reçu lors de l'envoi ou de la réception des paquets réseau (qui peut être différent du moment où l'utilisateur a écrit ou lu les données, en raison de la mise en mémoire tampon et des retransmissions).

Par exemple, vous pouvez définir des constantes pour représenter différents types de trafic réseau, comme illustré dans l'exemple de code suivant:

Kotlin

const val USER_INITIATED = 0x1000
const val APP_INITIATED = 0x2000
const val SERVER_INITIATED = 0x3000

Java

public static final int USER_INITIATED = 0x1000;
public static final int APP_INITIATED = 0x2000;
public static final int SERVER_INITIATED = 0x3000;

Vous pouvez ensuite taguer vos requêtes réseau en conséquence:

Kotlin

TrafficStats.setThreadStatsTag(USER_INITIATED)
TrafficStats.tagSocket(outputSocket)
// Transfer data using socket
TrafficStats.untagSocket(outputSocket)

Java

TrafficStats.setThreadStatsTag(USER_INITIATED);
TrafficStats.tagSocket(outputSocket);
// Transfer data using socket
TrafficStats.untagSocket(outputSocket);

La bibliothèque HttpURLConnection tague automatiquement les sockets en fonction de la valeur TrafficStats.getThreadStatsTag() actuelle. La bibliothèque ajoute également des tags aux sockets et les annule lorsqu'ils sont recyclés via des pools de messages keep-alive, comme illustré dans l'exemple de code suivant:

Kotlin

class IdentifyTransferSpikeTask {
    @WorkerThread
    fun request(url: String) {
        TrafficStats.setThreadStatsTag(APP_INITIATED)
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag()
    }
}

Java

public class IdentifyTransferSpikeTask {
    @WorkerThread
    public void request(String url) {
        TrafficStats.setThreadStatsTag(APP_INITIATED);
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag();
    }
}

Analyser les types de trafic réseau

Lorsque vous examinez le trafic réseau généré par votre application, vous devez comprendre la source du trafic afin de l'optimiser de manière appropriée. L'activité réseau générée fréquemment par votre application peut être tout à fait appropriée si elle répond aux actions des utilisateurs, mais complètement inappropriée si votre application n'est pas au premier plan, ou si l'appareil se trouve dans une poche ou un sac à main.

Analyser le trafic généré par l'utilisateur

Le trafic réseau déclenché par l'utilisateur peut être efficacement regroupé lorsqu'il effectue une tâche spécifique dans votre application, ou réparti de manière inégale lorsque l'utilisateur demande des informations supplémentaires que votre application doit obtenir. L'analyse du trafic réseau généré par l'utilisateur consiste à rechercher des modèles d'utilisation fréquente du réseau au fil du temps et à essayer de réduire leur fréquence en regroupant les requêtes.

L'imprévisibilité des requêtes utilisateur rend difficile l'optimisation de ce type d'utilisation du réseau dans votre application. De plus, les utilisateurs s'attendent à des réponses rapides lorsqu'ils utilisent activement une application. Par conséquent, retarder les requêtes d'efficacité peut nuire à l'expérience utilisateur. En règle générale, vous devez privilégier une réponse rapide à l'utilisation efficace du réseau lorsqu'un utilisateur interagit directement avec votre application.

Pour obtenir des recommandations sur l'optimisation du trafic généré par l'utilisateur, consultez la section Optimiser les requêtes déclenchées par l'utilisateur.

Analyser le trafic généré par l'application

Le trafic réseau déclenché par l'application est généralement un domaine dans lequel vous pouvez avoir un impact important sur l'utilisation efficace de la bande passante réseau. Lorsque vous analysez l'activité réseau de votre application, recherchez les périodes d'inactivité et déterminez si vous pouvez les allonger. Si vous constatez des tendances d'accès réseau cohérentes depuis votre application, essayez de regrouper ce trafic pour permettre au signal radio de l'appareil de revenir en mode économie d'énergie entre les périodes d'activité.

Pour obtenir des recommandations sur l'optimisation du trafic généré par l'application, consultez Optimiser les requêtes déclenchées par l'application.

Analyser le trafic généré par le serveur

L'activité réseau générée par les serveurs qui communiquent avec votre application est un autre domaine dans lequel vous pouvez avoir un impact important sur l'utilisation efficace de la bande passante réseau. Firebase Cloud Messaging (FCM) est un mécanisme léger utilisé pour transmettre des données d'un serveur à une instance d'application particulière. À l'aide de FCM, votre serveur peut avertir votre application exécutée sur un appareil particulier que de nouvelles données sont disponibles.

Pour obtenir des recommandations sur l'optimisation du trafic généré par le serveur, consultez la page Optimiser les requêtes déclenchées par le serveur.

Utiliser Battery Historian pour visualiser les effets du trafic réseau

Batterie Historian est un outil qui visualise l'utilisation de la batterie d'un appareil sur une période donnée. Vous pouvez utiliser cet outil pour analyser l'impact de votre activité réseau sur la consommation de la batterie. Par exemple, Battery Historian peut vous indiquer si votre application utilise la radio cellulaire plus souvent que prévu. Pour en savoir plus sur l'utilisation de Battery Historian, consultez Profiler l'utilisation de la batterie avec Batterystats et Battery Historian.