Netzwerkzugriff optimieren

Die Verwendung der drahtlosen Datenübertragung zur Datenübertragung ist möglicherweise eine der Hauptursachen für eine schnelle Akkuentladung Ihrer App. Um die durch Netzwerkaktivität verursachte Akkuentladung zu minimieren, müssen Sie wissen, wie sich Ihr Verbindungsmodell auf die zugrunde liegende Funkhardware auswirkt.

In diesem Abschnitt wird der drahtlose Funkzustandscomputer vorgestellt und erläutert, wie das Verbindungsmodell Ihrer App damit interagiert. Anschließend werden verschiedene Techniken angeboten, die bei ihrer Umsetzung dazu beitragen, die Auswirkungen des Datenverbrauchs Ihrer App auf den Akku zu minimieren.

Der Funkzustandsautomat

Das kabellose Funkgerät auf dem Gerät deines Nutzers verfügt über integrierte Energiesparfunktionen, die dazu beitragen, den Akkuverbrauch zu minimieren. Wenn das Funkgerät vollständig aktiv ist, verbraucht es einen erheblichen Stromverbrauch, aber wenn es inaktiv oder im Standby-Modus ist, verbraucht es nur sehr wenig Strom.

Dabei ist zu beachten, dass das Radio nicht sofort aus dem Standby-Modus in vollständig aktiv wechselt. Beim „Einschalten“ des Radios 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 mit dem „Einschalten“ des Radios verbundene Latenz zu minimieren.

Der Zustandsautomat für einen typischen 3G-Netzwerkfunk 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.
  • Niedriger Energieverbrauch: Ein Zwischenstatus, der den Akkuverbrauch um etwa 50 % reduziert.
  • Stand-by: Der minimal Strom verbrauchende Status, in dem keine Netzwerkverbindung aktiv ist.

Der Niedrig- und der Standby-Zustand entlädt zwar deutlich weniger Akku, führt aber auch zu einer erheblichen Latenz bei Netzwerkanfragen. Die Wiederherstellung aus dem niedrigen Zustand dauert etwa 1, 5 Sekunden.Der Wechsel vom Standby- in die volle Leistung kann mehr als 2 Sekunden dauern.

Zur Minimierung der Latenz verwendet der Zustandsautomaten eine Verzögerung, um den Übergang zu niedrigeren Energiezuständen zu verschieben. In Abbildung 1 wird das Timing von AT&T für eine typische 3G-Funkschnittstelle verwendet.


Abbildung 1: Typischer kabelloser 3G-Funksender.

Der Funkzustandsautomat auf jedem Gerät, insbesondere die damit verbundene Übergangsverzögerung („Extremzeit“) und Startlatenz, variiert je nach verwendeter drahtloser Funktechnologie (3G, LTE, 5G usw.) und wird vom Netz des Mobilfunkanbieters definiert und konfiguriert, über das das Gerät betrieben wird.

Auf dieser Seite wird ein repräsentativer Zustandsautomat für einen typischen drahtlosen 3G-Funk anhand der Daten von AT&T beschrieben. Die allgemeinen Prinzipien und die daraus resultierenden Best Practices gelten jedoch für alle Implementierungen kabelloser Funkverbindungen.

Dieser Ansatz ist besonders effektiv für das typische mobile Surfen im Web, da er unerwünschte Latenz beim Surfen im Web verhindert. 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, wo Apps sowohl im Vordergrund (wenn Latenz wichtig ist) als auch im Hintergrund ausgeführt werden (wo die Akkulaufzeit wichtig sein sollte).

Auswirkungen von Apps auf den Radiostatus

Jedes Mal, wenn Sie eine neue Netzwerkverbindung erstellen, wechselt die Funkschnittstelle in den vollen Leistungszustand. 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 führt also jede Datenübertragungssitzung dazu, dass das Funkgerät mindestens 18 Sekunden lang Energie verbraucht.

In der Praxis bedeutet dies, dass eine App, die dreimal pro Minute eine Datenübertragung von einer Sekunde durchführt, das kabellose Funkgerät dauerhaft aktiv hält und es wieder auf hohe Leistung umleitet, genau wie im Stand-by-Modus.


Abbildung 2: Relativer kabelloser Funkstromverbrauch für eine sekundengenaue Übertragung, die dreimal pro Minute ausgeführt wird. In der Abbildung ist die Hochleistungslatenz zwischen Ausführungen nicht enthalten.

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. Dadurch könnte sich das Funkgerät jede Minute 40 Sekunden im Bereitschaftsbetrieb befinden, was den Akkuverbrauch erheblich reduziert.


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

Optimierungsmethoden

Sie wissen jetzt, wie sich der Netzwerkzugriff auf die Akkulaufzeit auswirkt. Sehen wir uns nun an, wie Sie den Akkuverbrauch reduzieren und gleichzeitig für eine schnelle und reibungslose Nutzung sorgen können.

Bundle-Datenübertragungen

Wie im vorherigen Abschnitt bereits erwähnt, ist das Bündeln der Datenübertragungen, sodass weniger Daten übertragen werden, eine der besten Möglichkeiten, die Akkueffizienz zu verbessern.

Natürlich ist dies nicht immer möglich, wenn Ihre Anwendung Daten sofort als Reaktion auf eine Nutzeraktion empfangen oder senden muss. Sie können dies umgehen, indem Sie Daten antizipieren 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 Apps 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. Wenn der Nutzer beim Vorabruf eine Aktion in Ihrer App ausführt, prognostiziert die App, welche Daten für die nächste Reihe von Nutzeraktionen am wahrscheinlichsten benötigt werden, und ruft diese Daten in einem einzigen Burst über eine einzelne Verbindung mit voller Kapazität ab.

Durch das Frontloading Ihrer Übertragungen verringern Sie die Anzahl der Funkaktivierungen, die für das Herunterladen der Daten erforderlich sind. Dadurch wird nicht nur die Akkulaufzeit verlängert, sondern auch die Latenz verbessert, die erforderliche Bandbreite verringert und die Downloadzeit verkürzt.

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 ist ein Beispiel aus der Praxis.

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 Miniaturansichten, während sie sichtbar werden.

Bei diesem Ansatz ist das Radio während der meisten Lesersitzung gezwungen, aktiv zu bleiben, wenn Nutzer durch Schlagzeilen scrollen, die Kategorie wechseln und Artikel lesen. Nicht nur das, der ständige Wechsel zwischen Energiezuständen führt zu einer erheblichen Latenz beim Wechseln von Kategorien oder Lesen von Artikeln.

Ein besserer Ansatz besteht darin, beim Start eine angemessene Menge an Daten vorab abzurufen, beginnend mit dem ersten Satz von Schlagzeilen und Thumbnails, um eine Startzeit mit niedriger Latenz zu gewährleisten, und dann mit den verbleibenden Überschriften und Miniaturansichten sowie dem Artikeltext für jeden Artikel fortzufahren, der mindestens aus der primären Schlagzeilenliste verfügbar ist.

Eine weitere Alternative besteht darin, jede Überschrift, jede Miniaturansicht, jeden Artikeltext und möglicherweise sogar alle Bilder von Artikeln vorab abzurufen – in der Regel nach einem vorab festgelegten Zeitplan im Hintergrund. Bei diesem Ansatz riskieren Sie, eine erhebliche Bandbreite und lange Akkulaufzeit für das Herunterladen von nie verwendeten Inhalten zu verbrauchen. Daher sollte die Implementierung mit Vorsicht erfolgen.

Zusätzliche Überlegungen

Das Vorabrufen von Daten hat zwar viele Vorteile, aber ein zu aggressives Vorabrufen birgt auch das Risiko einer erhöhten Akkuentladung, Bandbreitennutzung – und des Downloadkontingents –, da nicht verwendete Daten heruntergeladen werden. Außerdem darf der Vorabruf nicht den Start der Anwendung verzögern, während sie auf den Abschluss des Prefetches wartet. In der Praxis kann dies bedeuten, dass Daten progressiv verarbeitet oder aufeinanderfolgende Übertragungen priorisiert werden, sodass die für den Anwendungsstart erforderlichen Daten zuerst heruntergeladen und verarbeitet werden.

Wie aggressiv Sie Daten vorab abrufen, hängt von der Größe der heruntergeladenen Daten und der Wahrscheinlichkeit ihrer Verwendung ab. Basierend auf der oben beschriebenen Zustandsmaschine können Sie Daten mit einer Wahrscheinlichkeit von 50 %, dass sie in der aktuellen Nutzersitzung verwendet werden, in der Regel für etwa 6 Sekunden (ca. 1–2 Megabyte) vorab abrufen, bevor die potenziellen Kosten für das Herunterladen nicht verwendeter Daten den potenziellen Einsparungen entsprechen, wenn Sie diese Daten nicht herunterladen.

Generell empfiehlt es sich, Daten vorab so abzurufen, dass Sie nur alle zwei bis fünf Minuten und in der Größenordnung von 1 bis 5 Megabyte einen weiteren Download starten müssen.

Nach diesem Prinzip sollten große Downloads, z. B. Videodateien, in regelmäßigen Abständen (alle zwei bis fünf Minuten) heruntergeladen werden. Dadurch werden im Grunde nur die Videodaten vorab abgerufen, die in den nächsten Minuten wahrscheinlich angesehen werden.

Eine Lösung besteht darin, den vollständigen Download so zu planen, dass er nur bei einer WLAN-Verbindung und eventuell nur dann erfolgt, wenn das Gerät geladen wird. Die WorkManager API unterstützt genau diesen Anwendungsfall. Sie ermöglicht es Ihnen, Hintergrundarbeiten einzuschränken, bis das Gerät die vom Entwickler angegebenen Kriterien erfüllt und beispielsweise aufgeladen wird und mit dem WLAN verbunden ist.

Prüfe die Verbindung, bevor du Anfragen stellst

Die Suche nach einem Mobilfunksignal ist einer der Vorgänge mit dem höchsten Akkuverbrauch 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 vorhanden ist, kann die App den Akku schonen, indem sie das Mobilfunknetz nicht zwingt, eine Suche durchzuführen. Die Anfrage kann dann geplant und im Batch mit anderen Anfragen ausgeführt werden, wenn eine Verbindung hergestellt wird.

Poolverbindungen

Eine weitere Strategie, die neben dem Batching und Prefetching hilfreich sein kann, besteht darin, die Netzwerkverbindungen Ihrer Anwendung zusammenzufassen.

Im Allgemeinen ist es effizienter, vorhandene Netzwerkverbindungen wiederzuverwenden, als neue zu initiieren. Durch die Wiederverwendung von Verbindungen kann das Netzwerk außerdem intelligenter auf Überlastungen und damit verbundene Probleme mit Netzwerkdaten reagieren.

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

Zusammenfassung und Blick nach vorn

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

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