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 Radio-Zustandsautomat

Das WLAN-Funkmodul des Geräts 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 Funkgerät nicht sofort aus dem Standby in den aktiven Modus wechseln kann. Beim Einschalten des Funkgeräts gibt es eine Latenzzeit. So wechselt der Akku langsam von höheren zu niedrigeren Energiezuständen, um bei Nichtgebrauch Energie zu sparen und gleichzeitig die Latenz beim Einschalten des Funkgeräts zu minimieren.

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

  • Vollständige Leistung: Wird verwendet, wenn eine Verbindung aktiv ist, sodass 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 voll funktionsfähig ist.Vom Standbymodus in den Vollmodus zu wechseln kann 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: Typische Zustandsmaschine 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 Grundsätze 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 Endzeit sorgt außerdem dafür, dass das Funkmodul nach einer Browser-Sitzung in einen niedrigeren Energiestatus wechseln kann.

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 Funkstatusautomaten

Jedes Mal, wenn Sie eine neue Netzwerkverbindung herstellen, wechselt das Funkmodul in den Vollleistungsstatus. Bei der oben beschriebenen typischen 3G-Funk-Zustandsmaschine bleibt die volle Leistung während der gesamten Übertragung und zusätzlich 5 Sekunden nach der Übertragung erhalten. Danach folgt ein Zeitraum von 12 Sekunden im Energiesparmodus. 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.

Im Vergleich dazu würde die Funkschnittstelle bei derselben App, die ihre Datenübertragungen bündelt und jede Minute eine einzelne dreisekündige Übertragung ausführt, insgesamt nur 20 Sekunden pro Minute im Hochleistungsmodus bleiben. 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 drahtloser Funkstromverbrauch für Übertragungen von drei Sekunden, die einmal pro Minute ausgeführt werden.

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 vermeiden, indem Sie Daten im Voraus abrufen. Andere Szenarien, z. B. das Senden von Protokollen oder Analysen an einen Server und andere nicht dringende, von der App initiierte Datenübertragungen, eignen sich sehr gut für Batch- und Bündelungsfunktionen. Tipps zum Planen von Netzwerkübertragungen im Hintergrund finden Sie unter Von der App initiierte Aufgaben optimieren.

Daten-Prefetch

Das Vorabladen von Daten ist eine weitere effektive Möglichkeit, die Anzahl der unabhängigen Datenübertragungssitzungen zu reduzieren, die in Ihrer App ausgeführt werden. 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.

Außerdem wird die Nutzerfreundlichkeit durch die Minimierung der In-App-Latenz verbessert, die durch das Warten auf den Abschluss von Downloads vor der Ausführung einer Aktion oder dem Ansehen von Daten entsteht.

Hier ein praktisches Beispiel:

Nachrichtenleser

Viele Nachrichten-Apps versuchen, die Bandbreite zu reduzieren, indem sie Schlagzeilen erst nach Auswahl einer Kategorie, vollständige Artikel nur dann, wenn der Nutzer sie lesen möchte, und Thumbnails erst dann herunterladen, 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.

Verbindung prüfen, bevor Anfragen gesendet werden

Die Suche nach einem Mobilfunksignal ist einer der energieintensivsten Vorgänge auf einem Mobilgerät. Bei von Nutzern initiierten Anfragen empfiehlt es sich, zuerst mit ConnectivityManager nach einer Verbindung zu suchen, wie in Verbindungsstatus und Verbindungsmessung überwachen gezeigt. 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, ist das Bündeln der Netzwerkverbindungen Ihrer App.

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 sehen wir uns drei verschiedene Arten von Netzwerkinteraktionen an, die für die meisten Apps üblich sind. Sie lernen die Treiber für jeden dieser Typen sowie moderne Techniken und APIs zur effizienten Verwaltung dieser Interaktionen kennen.