Netzwerkprobleme beheben

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 analysieren und seine Quelle ermitteln. Netzwerkanfragen können direkt von einer Nutzeraktion, von Ihrem eigenen App-Code oder von einem Server, der mit Ihrer App kommuniziert, stammen.

In diesem Thema erfahren Sie, wie Sie Ihren Netzwerkverkehr überwachen und kategorisieren und wie Sie Probleme erkennen und beheben.

Anfragen mit dem Network Profiler überwachen

Verwenden Sie den Network Profiler, um die Netzwerkanfragen Ihrer Anwendung zu verfolgen. Sie können beobachten, wie und wann Ihre App Daten überträgt, und den zugrunde liegenden Code entsprechend optimieren.



Abbildung 1: Netzwerktraffic erfassen Das Muster des Netzwerkverkehrs deutet darauf hin, dass die Effizienz durch das Vorabrufen von Anfragen oder das Bündeln von Uploads erheblich verbessert werden könnte.

Wenn Sie die Häufigkeit Ihrer Datenübertragungen und die Menge der bei jeder Verbindung übertragenen Daten im Blick behalten, können Sie Bereiche Ihrer Anwendung identifizieren, die akkusparender gestaltet werden können. In der Regel suchen Sie nach kurzen Spitzen, die verzögert werden können.

Um die Ursache von Übertragungsspitzen besser zu ermitteln, können Sie mit der Traffic Stats API die Datenübertragungen, die über einen Socket in einem bestimmten Thread erfolgen, mit TrafficStats.setThreadStatsTag() 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.

Sobald das Thread-Tag festgelegt ist, können Sie einzelne Steckdosen manuell mit Tags versehen und die Tags wieder entfernen. Verwenden Sie dazu TrafficStats.tagSocket() und TrafficStats.untagSocket(). Ein Tag wird auch angewendet, wenn ein Socket im Thread geöffnet wird oder wenn ein Server-Socket eine Verbindung akzeptiert.

Bei gleichzeitigem Zugriff auf denselben Socket durch mehrere Threads wird das Tag verwendet, das der Socket beim Senden oder Empfangen der Netzwerkpakete hatte. Dies kann sich aufgrund von Pufferung und Neuübertragungen von dem Zeitpunkt unterscheiden, zu dem der Nutzer die Daten geschrieben oder gelesen hat.

Sie können beispielsweise Konstanten definieren, um verschiedene Arten von Netzwerkverkehr darzustellen, 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 HttpURLConnection-Bibliothek taggt Sockets automatisch basierend auf dem aktuellen TrafficStats.getThreadStatsTag()-Wert. Die Bibliothek kennzeichnet und entfernt auch die Kennzeichnung von 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();
    }
}

Arten von Netzwerkverkehr analysieren

Wenn Sie sich den von Ihrer App generierten Netzwerkverkehr ansehen, müssen Sie die Quelle des Traffics kennen, damit Sie ihn entsprechend optimieren können. Häufige Netzwerkaktivitäten, die von Ihrer App generiert werden, sind möglicherweise angemessen, wenn sie auf Nutzeraktionen reagieren. Sie sind jedoch völlig unangemessen, wenn Ihre App nicht im Vordergrund ist oder sich das Gerät in einer Tasche befindet.

Vom Nutzer 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 abrufen muss. Ziel der Analyse des vom Nutzer initiierten Netzwerktraffics ist es, Muster häufiger Netzwerknutzung im Zeitverlauf zu erkennen und zu versuchen, die Häufigkeit durch Gruppieren von Anfragen zu verringern.

Die Unvorhersehbarkeit von Nutzeranfragen macht es schwierig, diese Art der Netzwerknutzung in Ihrer App zu optimieren. Außerdem erwarten Nutzer schnelle Antworten, wenn sie eine App aktiv verwenden. Das Verzögern von Anfragen zur Effizienzsteigerung kann daher zu einer schlechten Nutzererfahrung führen. Im Allgemeinen sollten Sie eine schnelle Reaktion auf den Nutzer gegenüber einer effizienten Nutzung des Netzwerks priorisieren, während ein Nutzer direkt mit Ihrer App interagiert.

Empfehlungen zur Optimierung des vom Nutzer initiierten Traffics finden Sie unter Vom Nutzer initiierte Anfragen optimieren.

Von Apps initiierte Zugriffe analysieren

App-initiierter Netzwerk-Traffic ist in der Regel ein Bereich, in dem Sie einen erheblichen Einfluss auf die effiziente Nutzung der Netzwerkbandbreite haben können. Achten Sie bei der Analyse der Netzwerkaktivität Ihrer App auf Inaktivitätsphasen und prüfen Sie, ob diese verlängert werden können. Wenn Sie Muster mit konsistentem Netzwerkzugriff durch Ihre App erkennen, versuchen Sie, diesen Traffic zu bündeln, damit das Funkmodul des Geräts zwischen den Aktivitätsphasen wieder in den Energiesparmodus wechseln kann.

Empfehlungen zur Optimierung von App-initiiertem Traffic finden Sie unter App-initiierte Anfragen optimieren.

Vom Server initiierte Zugriffe analysieren

Netzwerkaktivitäten, die von Servern initiiert werden, die mit Ihrer App kommunizieren, sind in der Regel auch ein Bereich, in dem Sie einen erheblichen Einfluss auf die effiziente Nutzung der Netzwerkbandbreite haben können. Firebase Cloud Messaging (FCM) ist ein einfacher Mechanismus zum Übertragen von Daten von einem Server an eine bestimmte App-Instanz. Mit FCM kann Ihr Server Ihre App, die auf einem bestimmten Gerät ausgeführt wird, 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.

Netzwerk-Traffic mit Battery Historian 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ät auf den Akkuverbrauch auswirkt. Mit Battery Historian können Sie beispielsweise sehen, ob Ihre App das Mobilfunkmodul häufiger verwendet als erwartet. Weitere Informationen zur Verwendung von Battery Historian finden Sie unter Akkunutzung mit Batterystats und Battery Historian analysieren.