Der von einer App generierte Netzwerkverkehr kann erhebliche Auswirkungen auf die Akkulaufzeit des Geräts haben. Um diesen Traffic zu optimieren, müssen Sie ihn messen und seine Quelle identifizieren. 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 Netzwerkverkehr überwachen und kategorisieren. Außerdem erhalten Sie Informationen zum Identifizieren und Beheben von Problemen.
Anfragen mit dem Network Profiler überwachen
Verwenden Sie den Network Profiler, um die Netzwerkanfragen Ihrer Anwendung zu verfolgen. Du kannst beobachten, wie und wann deine App Daten überträgt, und den zugrunde liegenden Code entsprechend optimieren.
Abbildung 1: Netzwerkverkehr verfolgen Das Muster des Netzwerkverkehrs deutet darauf hin, dass die Effizienz durch das Vorabrufen von Anfragen oder das Bündeln von Uploads drastisch verbessert werden könnte.
Wenn du die Häufigkeit deiner Datenübertragungen und die Menge der bei jeder Verbindung übertragenen Daten im Blick behältst, kannst du Bereiche deiner Anwendung identifizieren, die sich akkuschonender gestalten lassen. Im Allgemeinen suchen Sie nach kurzen Spitzen, die verzögert werden können.
Damit Sie die Ursache von Übertragungsspitzen besser identifizieren können, können Sie mit der Traffic Stats API die Datenübertragungen von einem Socket innerhalb eines bestimmten Threads mit TrafficStats.setThreadStatsTag() taggen.
Durch den Aufruf 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 die Tags entfernen.
Ein Tag wird auch angewendet, wenn ein Socket im Thread geöffnet wird oder wenn 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. Aufgrund von Zwischenspeicherung und erneuter Übertragung kann sich dieses Tag von dem Tag unterscheiden, das der Socket hatte, als 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 Bibliothek HttpURLConnection taggt Sockets automatisch anhand des aktuellen TrafficStats.getThreadStatsTag()-Werts. Die Bibliothek taggt und enttaggt 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 App generierten Netzwerkverkehr ansehen, müssen Sie die Quelle des Traffics kennen, um ihn entsprechend optimieren zu können. Häufige Netzwerkaktivitäten, die von Ihrer App generiert werden, können durchaus angemessen sein, wenn sie auf Nutzeraktionen reagieren. Sie sind jedoch völlig unangemessen, wenn sich Ihre App nicht im Vordergrund befindet oder wenn sich das Gerät in einer Tasche befindet.
Von Nutzern initiierten Traffic 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 abrufen muss. Ihr Ziel bei der Analyse des vom Nutzer initiierten Netzwerkverkehrs ist es, nach Mustern häufiger Netzwerknutzung im Laufe der Zeit zu suchen und zu versuchen, die Häufigkeit zu verringern, indem Sie Anfragen gruppieren.
Die Unvorhersehbarkeit von Nutzeranfragen macht es schwierig, diese Art der Netzwerknutzung in deiner App zu optimieren. Außerdem erwarten Nutzer schnelle Antworten, wenn sie eine App aktiv verwenden. Wenn du Anfragen aus Effizienzgründen verzögerst, kann dies zu einer schlechten Nutzererfahrung führen. Im Allgemeinen sollten Sie eine schnelle Antwort an den Nutzer gegenüber einer effizienten Nutzung des Netzwerks priorisieren, während ein Nutzer direkt mit Ihrer App interagiert.
Empfehlungen zur Optimierung des von Nutzern initiierten Traffics finden Sie unter Von Nutzern initiierte Anfragen optimieren.
Von der App initiierten Traffic analysieren
Der von der App initiierte Netzwerkverkehr ist in der Regel ein Bereich, in dem Sie die effiziente Nutzung der Netzwerkbandbreite erheblich beeinflussen können. Sucht bei der Analyse der Netzwerkaktivität eurer App nach Zeiträumen der Inaktivität und prüft, ob diese verlängert werden können. Wenn Sie Muster für konsistenten Netzwerkzugriff von Ihrer App sehen, versuchen Sie, diesen Traffic zu bündeln, damit das Gerät zwischen den Aktivitätsphasen wieder in den Energiesparmodus wechseln kann.
Empfehlungen zur Optimierung des von der App initiierten Traffics finden Sie unter Von der App initiierte Anfragen optimieren.
Vom Server initiierten Traffic analysieren
Netzwerkaktivitäten, die von Servern initiiert werden, die mit Ihrer App kommunizieren, sind ebenfalls ein Bereich, in dem Sie die effiziente Nutzung der Netzwerkbandbreite erheblich beeinflussen können. Firebase Cloud Messaging (FCM) ist ein einfacher 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, darüber benachrichtigen, dass neue Daten für sie verfügbar sind.
Empfehlungen zur Optimierung des vom Server initiierten Traffics finden Sie unter Vom Server initiierte 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 kannst du analysieren, wie sich deine Netzwerkaktivität auf den Akkuverbrauch auswirkt. Battery Historian kann dir beispielsweise zeigen, ob deine App die Mobilfunkschnittstelle häufiger als erwartet verwendet. Weitere Informationen zur Verwendung von Battery Historian finden Sie unter Akkunutzung mit Batterystats und Battery Historian profilieren.