Der von einer App generierte Netzwerkverkehr kann sich erheblich auf die Akkulaufzeit des Geräts auswirken. Um diesen Traffic zu optimieren, müssen Sie ihn messen und die Quelle ermitteln. Netzwerkanfragen können direkt von einer Nutzeraktion, von Ihrem eigenen App-Code oder von einem Server stammen, der mit Ihrer App kommuniziert.
In diesem Thema erfahren Sie, wie Sie Ihren Netzwerktraffic beobachten und kategorisieren können. Außerdem erhalten Sie Tipps zum Erkennen und Beheben von Problemen.
Anfragen mit dem Netzwerk-Profiler überwachen
Verwenden Sie den Netzwerk-Profiler, um die Netzwerkanfragen Ihrer Anwendung zu erfassen. Sie können überwachen, wie und wann Ihre App Daten überträgt, und den zugrunde liegenden Code entsprechend optimieren.
Wenn Sie die Häufigkeit der Datenübertragungen und die Menge der übertragenen Daten bei jeder Verbindung überwachen, können Sie Bereiche Ihrer Anwendung identifizieren, die energieeffizienter gestaltet werden können. Im Allgemeinen suchen Sie nach kurzen Spitzen, die sich verzögern können.
Um die Ursache von Übertragungsspitzen besser zu identifizieren, können Sie mit der Traffic Stats API die Datenübertragungen, die von einem Socket in einem bestimmten Thread mit TrafficStats.setThreadStatsTag()
erfolgen, mit Tags kennzeichnen.
Durch Aufrufen dieser Funktion wird nicht automatisch der gesamte Traffic für einen bestimmten Thread getaggt. Die Tags müssen auf die Sockets angewendet werden.
Nachdem das Thread-Tag festgelegt wurde, können Sie einzelne Sockets manuell mit TrafficStats.tagSocket()
und TrafficStats.untagSocket()
taggen und das Tag wieder entfernen.
Ein Tag wird auch angewendet, wenn ein Socket im Thread geöffnet wird oder ein Server-Socket eine Verbindung akzeptiert.
Beim gleichzeitigen Zugriff mehrerer Threads auf denselben Socket wird das Tag verwendet, das der Socket beim Senden oder Empfangen der Netzwerkpakete hatte. Dies kann sich aufgrund von Pufferung und erneuten Übertragungen von dem Zeitpunkt unterscheiden, zu dem der Nutzer die Daten geschrieben oder gelesen hat.
Sie können beispielsweise Konstanten definieren, die verschiedene Arten von Netzwerkverkehr darstellen, wie im folgenden Codebeispiel gezeigt:
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;
Anschließend können Sie Ihre Netzwerkanfragen entsprechend taggen:
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);
Die HttpURLConnection
-Bibliothek taggt Sockets automatisch basierend auf dem aktuellen TrafficStats.getThreadStatsTag()
-Wert. Die Bibliothek kennzeichnet und entfernt auch Sockets, wenn sie über Keep-Alive-Pools wiederverwendet werden, wie im folgenden Codebeispiel gezeigt:
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(); } }
Netzwerkverkehrstypen analysieren
Wenn Sie sich den von Ihrer Anwendung generierten Netzwerktraffic ansehen, müssen Sie die Quelle des Traffics kennen, um ihn entsprechend optimieren zu können. Eine häufige Netzwerkaktivität deiner App kann durchaus angemessen sein, wenn sie auf Nutzeraktionen reagiert, ist aber völlig unangemessen, wenn deine App nicht im Vordergrund ausgeführt wird oder sich das Gerät in einer Hosentasche befindet.
Von Nutzern initiierte Zugriffe analysieren
Vom Nutzer initiierter Netzwerkverkehr kann effizient gruppiert werden, während ein Nutzer eine bestimmte Aufgabe in Ihrer App ausführt, oder ungleichmäßig verteilt werden, wenn der Nutzer zusätzliche Informationen anfordert, die Ihre App benötigt. Bei der Analyse des von Nutzern initiierten Netzwerktraffics geht es darum, nach Mustern häufiger Netzwerknutzung im Zeitverlauf zu suchen und zu versuchen, die Häufigkeit zu verringern, indem Anfragen gruppiert werden.
Aufgrund der Unvorhersehbarkeit von Nutzeranfragen ist es schwierig, diese Art der Netzwerknutzung in Ihrer App zu optimieren. Außerdem erwarten Nutzer schnelle Antworten, wenn sie eine App aktiv verwenden. Wenn Sie Anfragen aus Effizienzgründen verzögern, kann dies zu einer schlechten Nutzererfahrung führen. Im Allgemeinen sollten Sie eine schnelle Reaktion auf den Nutzer vor einer effizienten Nutzung des Netzwerks priorisieren, während ein Nutzer direkt mit Ihrer App interagiert.
Empfehlungen zur Optimierung von vom Nutzer initiierten Zugriffen finden Sie unter Vom Nutzer initiierte Anfragen optimieren.
Von Apps initiierten Traffic analysieren
Der von Apps initiierte Netzwerkverkehr ist in der Regel ein Bereich, in dem Sie einen erheblichen Einfluss auf die effiziente Nutzung der Netzwerkbandbreite haben können. Suchen Sie bei der Analyse der Netzwerkaktivität Ihrer App nach Inaktivitätszeiten und prüfen Sie, ob diese verkürzt werden können. Wenn Sie Muster für den kontinuierlichen Netzwerkzugriff Ihrer App erkennen, sollten Sie versuchen, diesen Traffic zu bündeln, damit das Funkmodul des Geräts zwischen den Aktivitätszeiten wieder in den Energiesparmodus wechseln kann.
Empfehlungen zur Optimierung von app-initiierten Zugriffen finden Sie unter App-initiierte Anfragen optimieren.
Vom Server initiierten Traffic analysieren
Netzwerkaktivitäten, die von Servern initiiert werden, die mit Ihrer App kommunizieren, sind in der Regel ein Bereich, in dem Sie einen erheblichen Einfluss auf die effiziente Nutzung der Netzwerkbandbreite haben können. Firebase Cloud Messaging (FCM) ist ein schlanker Mechanismus, mit dem Daten von einem Server an eine bestimmte App-Instanz übertragen werden. Mit FCM kann Ihr Server Ihre App, die auf einem bestimmten Gerät ausgeführt wird, benachrichtigen, dass neue Daten verfügbar sind.
Empfehlungen zur Optimierung des serverinitiierten Traffics finden Sie unter Serverinitiierte Anfragen optimieren.
Mit Battery Historian die Auswirkungen des Netzwerkverkehrs visualisieren
Battery Historian ist ein Tool, mit dem der Akkuverbrauch eines Geräts über einen bestimmten Zeitraum visualisiert wird. Mit diesem Tool können Sie analysieren, wie sich Ihre Netzwerkaktivitäten auf den Akkuverbrauch auswirken. Mit Battery Historian können Sie beispielsweise sehen, ob Ihre App das Mobilfunkradio häufiger nutzt als erwartet. Weitere Informationen zur Verwendung von Battery Historian finden Sie unter Akkunutzung mit Batterystats und Battery Historian analysieren.