Netzwerkprobleme beheben

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 Artikel erfahren Sie, wie Sie Ihren Netzwerkverkehr überwachen und kategorisieren können, und Sie erhalten eine Anleitung zum Erkennen und Beheben von Problemen.

Netzwerk-Profiler zum Überwachen von Anfragen verwenden

Mit dem Netzwerk-Profiler können Sie die Netzwerkanfragen Ihrer Anwendung verfolgen. Sie können überwachen, wie und wann Ihre Anwendung Daten überträgt, und den zugrunde liegenden Code entsprechend optimieren.



Abbildung 1: Netzwerkverkehr wird erfasst. Das Muster des Netzwerktraffics deutet darauf hin, dass die Effizienz durch Vorabruf von Anfragen oder Bündeln von Uploads erheblich verbessert werden könnte.

Indem Sie die Häufigkeit der Datenübertragungen und die Menge der während jeder Verbindung übertragenen Daten überwachen, können Sie Bereiche Ihrer Anwendung identifizieren, in denen der Akku noch effizienter gemacht werden kann. Im Allgemeinen suchen Sie nach kurzen Spitzen, die sich verzögern können.

Um die Ursache für Übertragungsspitzen besser zu ermitteln, können Sie mit der Traffic Stats API die Datenübertragungen, die von einem Socket in einem bestimmten Thread erfolgen, mit TrafficStats.setThreadStatsTag() kennzeichnen. Durch den Aufruf dieser Funktion wird nicht automatisch der gesamte Traffic für einen bestimmten Thread mit einem Tag versehen. Die Tags müssen auf die Sockets angewendet werden.

Wenn das Thread-Tag festgelegt ist, können Sie einzelne Sockets mithilfe von TrafficStats.tagSocket() und TrafficStats.untagSocket() manuell taggen bzw. das Tag wieder aufheben. Ein Tag wird auch angewendet, wenn ein Socket im Thread geöffnet wird oder wenn ein Server-Socket eine Verbindung akzeptiert.

Der gleichzeitige Zugriff auf denselben Socket von mehreren Threads verwendet das Tag, das der Socket beim Senden oder Empfangen der Netzwerkpakete hatte. Dieses kann sich aufgrund von Puffern und erneuten Übertragungen vom Schreiben oder Lesen der Daten durch den Nutzer unterscheiden.

Sie können beispielsweise Konstanten zur Darstellung verschiedener Arten von Netzwerkverkehr definieren, 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;

Sie können Ihre Netzwerkanfragen dann 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 kennzeichnet Sockets automatisch anhand des aktuellen Werts für TrafficStats.getThreadStatsTag(). Die Bibliothek taggt Sockets auch, 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();
    }
}

Arten des Netzwerktraffics analysieren

Wenn Sie sich den von Ihrer Anwendung generierten Netzwerktraffic ansehen, müssen Sie die Quelle des Traffics verstehen, um ihn entsprechend optimieren zu können. Häufige Netzwerkaktivitäten, die von Ihrer App generiert werden, sind möglicherweise völlig angemessen, wenn sie auf Nutzeraktionen reagiert. Sie ist jedoch völlig unangemessen, wenn Ihre App nicht im Vordergrund ausgeführt wird oder sich das Gerät in einer Tasche oder Handtasche befindet.

Vom Nutzer initiierten Traffic analysieren

Der vom Nutzer initiierte Netzwerkverkehr kann effizient gruppiert werden, während ein Nutzer eine bestimmte Aufgabe in Ihrer Anwendung ausführt, oder ungleichmäßig verteilt werden, wenn der Nutzer zusätzliche Informationen anfordert, die die Anwendung benötigt. Das Ziel bei der Analyse des vom Nutzer initiierten Netzwerktraffics besteht darin, nach Mustern mit häufiger Netzwerknutzung im Zeitverlauf zu suchen und die Häufigkeit zu reduzieren, indem Sie Anfragen gruppieren.

Die Unvorhersehbarkeit von Nutzeranfragen erschwert die Optimierung dieser Art der Netzwerknutzung in Ihrer Anwendung. Außerdem erwarten Nutzer schnelle Antworten, wenn sie eine Anwendung aktiv verwenden. Daher kann das Verzögern von Anfragen aus Effizienzgründen die Nutzerfreundlichkeit beeinträchtigen. Im Allgemeinen sollten Sie dem Nutzer eine schnelle Antwort vor einer effizienten Netzwerknutzung Vorrang geben, wenn ein Nutzer direkt mit Ihrer Anwendung interagiert.

Empfehlungen zur Optimierung des vom Nutzer 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 beeinträchtigen können. Suchen Sie bei der Analyse der Netzwerkaktivität Ihrer Anwendung nach Zeiträumen mit Inaktivität und ermitteln Sie, ob sie erhöht werden können. Wenn du Muster eines konsistenten Netzwerkzugriffs von deiner App aus siehst, versuche, diesen Traffic bündeln zu lassen, damit die Gerätefunksteuerung zwischen Phasen der Aktivität 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

Auch Netzwerkaktivitäten, die von Servern initiiert werden, die mit Ihrer Anwendung kommunizieren, sind in der Regel 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 Anwendungsinstanz übertragen werden. Mit FCM kann Ihr Server die auf einem bestimmten Gerät ausgeführte App darüber informieren, 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 „Akkuhistorian“ die Auswirkungen des Netzwerkverkehrs visualisieren

Akkuhistorian ist ein Tool, das den Akkuverbrauch eines Geräts über einen bestimmten Zeitraum visualisiert. Mit diesem Tool können Sie analysieren, wie sich Ihre Netzwerkaktivität auf den Akkuverbrauch auswirkt. Mit dem Akku-Verlauf kann Ihnen beispielsweise angezeigt werden, ob Ihre App die Mobilfunkverbindung häufiger als erwartet nutzt. Weitere Informationen zur Verwendung von „Akku Historian“ findest du unter Profil der Akkunutzung mit Batterystats und dem Akkuverlauf.