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 pour identifier et résoudre les 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 en conséquence.



Figure 1 : Suivi du 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 qui peuvent être rendus plus économes en batterie. En général, vous recherchez de courts pics 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 ne tague pas automatiquement tout le trafic d'un thread particulier. Les tags doivent être appliqués aux sockets.

Une fois la balise de thread définie, vous pouvez ajouter et supprimer manuellement des tags pour des sockets individuels à 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 de serveur accepte une connexion.

L'accès simultané au même socket par plusieurs threads utilise le tag du socket 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 de la retransmission).

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 ajouter des tags à 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 et supprime également des tags sur les sockets lorsqu'ils sont recyclés via des pools de messages keep-alive, comme indiqué 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 sa source afin de l'optimiser en conséquence. Une 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'un utilisateur effectue une tâche spécifique dans votre application, ou réparti de manière inégale à mesure qu'il demande des informations supplémentaires que votre application doit obtenir. Lors de l'analyse du trafic réseau généré par l'utilisateur, votre objectif est de rechercher des modèles d'utilisation fréquente du réseau au fil du temps et d'essayer de réduire leur fréquence en regroupant les requêtes.

L'imprévisibilité des requêtes utilisateur complique 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 général, il est préférable de donner la priorité à une réponse rapide plutôt qu'à une 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 généré par l'application est généralement une zone dans laquelle vous pouvez avoir un impact significatif sur l'utilisation efficace de la bande passante réseau. Lors de l'analyse de l'activité réseau de votre application, recherchez les périodes d'inactivité et déterminez si elles peuvent être augmentées. Si vous constatez des modèles d'accès réseau cohérent 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 la section 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 en cours d'exécution 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 section 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 l'activité de votre réseau sur la consommation de la batterie. Par exemple, Battery Historian peut vous indiquer si votre application utilise la radio mobile 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.