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 section explique comment surveiller et catégoriser votre trafic réseau, et fournit des conseils pour identifier et résoudre les problèmes.

Utiliser le Profileur de réseau pour surveiller les requêtes

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 : Suivre le trafic réseau Le schéma 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 éléments de votre application qui peuvent être optimisés pour économiser la batterie. En général, 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 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 balises à des sockets individuels à l'aide de TrafficStats.tagSocket() et de TrafficStats.untagSocket(). Une balise est également appliquée 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 la balise que le socket avait lorsque les paquets réseau ont été envoyés ou reçus (ce qui peut être différent de la date et de l'heure auxquelles l'utilisateur a écrit ou lu les données, en raison de la mise en mémoire tampon et des nouvelles transmissions).

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. 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 généré par l'utilisateur peut être efficacement regroupé lorsqu'il effectue une tâche spécifique dans votre application, ou s'éparpiller à mesure que l'utilisateur demande des informations supplémentaires pour votre application. L'analyse du trafic réseau généré par l'utilisateur consiste à trouver des tendances d'utilisation fréquente du réseau au fil du temps et à tenter 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, privilégiez une réponse rapide à l'utilisateur à 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 généré 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 récurrents de la part de votre application, essayez de regrouper ce trafic pour permettre au signal radio de l'appareil de passer 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 généré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 Optimiser les requêtes générées par le serveur.

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

Battery Historian est un outil qui visualise la consommation 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 cellule GSM 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.