Netzwerkzugriff optimieren

Die Nutzung des WLANs zur Datenübertragung ist eine der größten Akkubelastungen Ihrer App. Um den Akkuverbrauch durch Netzwerkaktivitäten zu minimieren, ist es wichtig, dass Sie wissen, wie sich Ihr Konnektivitätsmodell auf die zugrunde liegende Funkhardware auswirkt.

In diesem Abschnitt wird der Funkstatusautomat vorgestellt und erläutert, wie das Konnektivitätsmodell Ihrer App damit interagiert. Anschließend werden verschiedene Methoden beschrieben, mit denen sich die Auswirkungen des Datenverbrauchs Ihrer App auf den Akku minimieren lassen.

Der Funkzustandsautomat

Das WLAN auf dem Gerät Ihres Nutzers verfügt über integrierte Energiesparfunktionen, mit denen der Akkuverbrauch minimiert wird. Bei voller Aktivität verbraucht das Funkmodul viel Strom, im Inaktivitäts- oder Standbymodus jedoch nur sehr wenig.

Wichtig ist, dass das Radio nicht sofort aus dem Standby in den aktiven Modus wechseln kann. Beim Einschalten des Funkgeräts gibt es eine Latenzzeit. Daher wechselt der Akku langsam von einem höheren Energiestatus in einen niedrigeren Energiestatus, um Energie zu sparen, wenn er nicht verwendet wird. Gleichzeitig wird versucht, die Latenz beim „Einschalten“ des Funknetzes zu minimieren.

Die Zustandsmaschine für ein typisches 3G-Netzwerkfunkgerät besteht aus drei Energiezuständen:

  • Volle Leistung: wird verwendet, wenn eine Verbindung aktiv ist, damit das Gerät Daten mit der höchstmöglichen Geschwindigkeit übertragen kann.
  • Energiesparmodus: Ein Zwischenstatus, der den Akkuverbrauch um etwa 50 % reduziert.
  • Standby: Der Zustand mit dem geringsten Energieverbrauch, währenddessen keine Netzwerkverbindung aktiv ist.

Im Energiespar- und Standbymodus wird zwar deutlich weniger Akku verbraucht, aber auch die Latenz bei Netzwerkanfragen ist deutlich höher. Es dauert etwa 1,5 Sekunden, bis das Gerät wieder auf volle Leistung hochgefahren ist.Vom Standbymodus bis zur vollen Leistung kann es mehr als 2 Sekunden dauern.

Um die Latenz zu minimieren, verwendet der Zustandsautomat eine Verzögerung, um den Übergang zu niedrigeren Energiezuständen zu verschieben. In Abbildung 1 werden die Timings von AT&T für ein typisches 3G-Funkschnittstellenmodul verwendet.


Abbildung 1: Typischer Zustandsautomat für 3G-Funkschnittstellen.

Der Funkstatusautomat auf jedem Gerät, insbesondere die zugehörige Übergangsverzögerung („Tail Time“) und die Startlatenz, variieren je nach verwendeter drahtloser Funktechnologie (3G, LTE, 5G usw.) und werden vom Mobilfunknetz definiert und konfiguriert, über das das Gerät betrieben wird.

Auf dieser Seite wird ein repräsentativer Zustandsautomat für ein typisches 3G-Funkgerät beschrieben, basierend auf Daten von AT&T. Die allgemeinen Prinzipien und die daraus resultierenden Best Practices gelten jedoch für alle drahtlosen Funkimplementierungen.

Dieser Ansatz ist besonders effektiv für das typische mobile Surfen im Web, da unerwünschte Latenzen beim Surfen vermieden werden. Die relativ kurze Extremzeit sorgt auch dafür, dass das Radio nach dem Ende einer Browsersitzung in einen niedrigeren Energieverbrauch wechselt.

Leider kann dieser Ansatz zu ineffizienten Apps auf modernen Smartphone-Betriebssystemen wie Android führen, bei denen Apps sowohl im Vordergrund (wo die Latenz wichtig ist) als auch im Hintergrund ausgeführt werden (wo die Akkulaufzeit priorisiert werden sollte).

Auswirkungen von Apps auf den Radiostatus

Jedes Mal, wenn Sie eine neue Netzwerkverbindung herstellen, wechselt das Funkmodul in den Vollleistungsstatus. Das zuvor beschriebene typische 3G-Funkgerät bleibt für die Dauer der Übertragung bei voller Leistung – plus weitere 5 Sekunden Extremzeit gefolgt von 12 Sekunden für den Niedrigenergiezustand. Bei einem typischen 3G-Gerät verbraucht das Funkmodul also mindestens 18 Sekunden lang Energie.

In der Praxis bedeutet das, dass eine App, die dreimal pro Minute eine Datenübertragung von einer Sekunde durchführt, das WLAN dauerhaft aktiv hält und es genau dann wieder auf Hochleistung umstellt, wenn es in den Standbymodus wechselt.


Abbildung 2: Relativer Verbrauch der drahtlosen Funkenergie für eine Übertragung von einer Sekunde, die dreimal pro Minute ausgeführt wird. Die Abbildung enthält keine Latenz für das Einschalten zwischen den einzelnen Durchläufen.

Wenn hingegen dieselbe Anwendung ihre Datenübertragungen bündelt und jede Minute eine einzige Übertragung von drei Sekunden ausführt, würde die Funkschnittstelle dadurch insgesamt nur 20 Sekunden pro Minute im Hochleistungszustand gehalten werden. So kann das Funkgerät 40 Sekunden pro Minute im Standby-Modus bleiben, was zu einer deutlichen Reduzierung des Akkuverbrauchs führt.


Abbildung 3: Relativer Akkuverbrauch für 3-sekündige Übertragungen, der einmal pro Minute läuft.

Optimierungstechniken

Nachdem Sie nun wissen, wie sich der Netzwerkzugriff auf die Akkulaufzeit auswirkt, sehen wir uns an, wie Sie den Akkuverbrauch reduzieren und gleichzeitig eine schnelle und flüssige Nutzererfahrung bieten können.

Datenübertragungen bündeln

Wie bereits im vorherigen Abschnitt erwähnt, ist es eine der besten Möglichkeiten, die Akkueffizienz zu verbessern, wenn Sie Ihre Datenübertragungen bündeln, sodass Sie mehr Daten seltener übertragen.

Das ist natürlich nicht immer möglich, wenn Ihre App Daten sofort als Reaktion auf eine Nutzeraktion empfangen oder senden muss. Sie können dies umgehen, indem Sie Daten vorhersehen und vorab abrufen. Andere Szenarien, wie das Senden von Logs oder Analysen an einen Server und andere, nicht dringende, von der Anwendung initiierte Datenübertragungen, eignen sich sehr gut für Batchverarbeitung und Bündelung. Tipps zum Planen von Netzwerkübertragungen im Hintergrund finden Sie unter Von der App initiierte Aufgaben optimieren.

Daten vorabrufen

Das Vorabrufen von Daten ist eine weitere effektive Möglichkeit, die Anzahl unabhängiger Datenübertragungssitzungen zu reduzieren, die Ihre Anwendung ausführt. Beim Vorabladen wird bei einer Nutzeraktion in Ihrer App vorhergesagt, welche Daten für die nächste Reihe von Nutzeraktionen am wahrscheinlichsten benötigt werden. Diese Daten werden dann in einem einzigen Burst über eine einzige Verbindung mit voller Kapazität abgerufen.

Durch die Vorab-Übertragung reduzieren Sie die Anzahl der Radioaktivierungen, die zum Herunterladen der Daten erforderlich sind. So sparen Sie nicht nur Akkulaufzeit, sondern verbessern auch die Latenz, senken die erforderliche Bandbreite und verkürzen die Downloadzeiten.

Der Vorabruf verbessert auch die Nutzererfahrung, da die In-App-Latenz minimiert wird, die dadurch verursacht wird, dass auf den Abschluss von Downloads gewartet wird, bevor eine Aktion ausgeführt oder Daten angezeigt werden.

Hier ein praktisches Beispiel:

Einen Newsreader

Viele Nachrichten-Apps versuchen, die Bandbreite zu reduzieren, indem sie Schlagzeilen erst nach Auswahl einer Kategorie, vollständige Artikel nur dann herunterladen, wenn der Nutzer sie lesen möchte, und Thumbnails erst, wenn sie in den Blick kommen.

Bei diesem Ansatz muss der Radiosender für die meisten Nutzer während der Nachrichtenlesesitzung aktiv bleiben, während sie durch Schlagzeilen scrollen, Kategorien wechseln und Artikel lesen. Außerdem führt das ständige Wechseln zwischen den Energiestatus zu einer erheblichen Verzögerung beim Wechseln zwischen Kategorien oder beim Lesen von Artikeln.

Besser ist es, beim Start eine angemessene Menge an Daten vorab zu laden, beginnend mit den ersten Nachrichtenüberschriften und -miniaturansichten, um eine kurze Startzeit zu ermöglichen. Danach folgen die restlichen Überschriften und Miniaturansichten sowie der Artikeltext für jeden Artikel, der mindestens in der Liste der Hauptüberschriften verfügbar ist.

Eine weitere Alternative besteht darin, alle Überschriften, Thumbnails, Artikeltexte und möglicherweise sogar vollständige Artikelbilder vorab zu laden – in der Regel im Hintergrund nach einem vordefinierten Zeitplan. Bei diesem Ansatz besteht das Risiko, dass viel Bandbreite und Akkulaufzeit für den Download von Inhalten verbraucht werden, die nie verwendet werden. Daher sollte er mit Vorsicht eingesetzt werden.

Weitere Überlegungen

Das Vorabladen von Daten bietet viele Vorteile. Wenn es jedoch zu häufig verwendet wird, kann es zu einer erhöhten Akkuentladung, einer höheren Bandbreitennutzung und einem höheren Downloadkontingent kommen, da Daten heruntergeladen werden, die nicht verwendet werden. Außerdem ist es wichtig, dass das Vorabladen das Starten der Anwendung nicht verzögert, während die App auf den Abschluss des Vorabladens wartet. In der Praxis kann das bedeuten, dass Daten schrittweise verarbeitet oder aufeinanderfolgende Übertragungen so priorisiert werden, dass die für den Anwendungsstart erforderlichen Daten zuerst heruntergeladen und verarbeitet werden.

Wie aggressiv Sie Daten im Voraus abrufen, hängt von der Größe der heruntergeladenen Daten und der Wahrscheinlichkeit ab, dass sie verwendet werden. Als grobe Orientierung: Basierend auf dem oben beschriebenen Zustandsautomaten können Sie für Daten, die mit einer Wahrscheinlichkeit von 50% innerhalb der aktuellen Nutzersitzung verwendet werden, in der Regel etwa 6 Sekunden (ungefähr 1–2 Megabyte) vorab abrufen, bevor die potenziellen Kosten für das Herunterladen nicht verwendeter Daten den potenziellen Einsparungen entsprechen, die durch das Nichtherunterladen dieser Daten erzielt werden.

Im Allgemeinen ist es empfehlenswert, Daten vorab zu laden, damit Sie nur alle zwei bis fünf Minuten einen weiteren Download in der Größenordnung von 1 bis 5 Megabyte starten müssen.

Gemäß diesem Prinzip sollten große Downloads wie Videodateien in regelmäßigen Abständen (alle 2 bis 5 Minuten) in mehreren Teilen heruntergeladen werden, sodass nur die Videodaten vorab abgerufen werden, die in den nächsten Minuten wahrscheinlich angesehen werden.

Eine Lösung besteht darin, den vollständigen Download nur dann zu planen, wenn eine WLAN-Verbindung besteht und möglicherweise nur, wenn das Gerät geladen wird. Die WorkManager API unterstützt genau diesen Anwendungsfall. Sie können die Hintergrundarbeit einschränken, bis das Gerät die vom Entwickler angegebenen Kriterien erfüllt, z. B. aufgeladen ist und mit einem WLAN verbunden ist.

Prüfen Sie die Verbindung, bevor Sie Anfragen stellen

Die Suche nach einem Mobilfunksignal ist einer der energieintensivsten Vorgänge auf einem Mobilgerät. Eine Best Practice für vom Nutzer initiierte Anfragen besteht darin, zuerst mit ConnectivityManager nach einer Verbindung zu suchen, wie unter Verbindungsstatus und Verbindungsmessung überwachen beschrieben. Wenn kein Netzwerk verfügbar ist, kann die App den Akku schonen, da das Mobilfunkradio nicht zur Suche gezwungen wird. Die Anfrage kann dann geplant und in einem Batch mit anderen Anfragen ausgeführt werden, sobald eine Verbindung hergestellt wurde.

Poolverbindungen

Eine weitere Strategie, die zusätzlich zu Batching und Prefetching hilfreich sein kann, besteht darin, die Netzwerkverbindungen Ihrer App zu poolen.

Es ist im Allgemeinen effizienter, vorhandene Netzwerkverbindungen wiederzuverwenden, als neue zu initiieren. Durch die Wiederverwendung von Verbindungen kann das Netzwerk außerdem intelligenter auf Überlastungen und damit verbundene Netzwerkdatenprobleme reagieren.

HttpURLConnection und die meisten HTTP-Clients wie OkHttp aktivieren standardmäßig das Verbindungs-Pooling und verwenden dieselbe Verbindung für mehrere Anfragen.

Zusammenfassung und Ausblick

In diesem Abschnitt haben Sie viel über das WLAN und einige Strategien erfahren, die Sie allgemein anwenden können, um eine schnelle, responsive Nutzererfahrung zu bieten und gleichzeitig den Akkuverbrauch zu senken.

Im nächsten Abschnitt werfen wir einen Blick auf drei verschiedene Arten von Netzwerkinteraktionen, die den meisten Anwendungen vorkommen. Sie lernen die Treiber für jeden dieser Typen sowie moderne Techniken und APIs zur effizienten Verwaltung dieser Interaktionen kennen.