Netzwerkzugriff optimieren

Die Verwendung der drahtlosen Funkschnittstelle zur Datenübertragung stellt möglicherweise eine der größten Entladungen des Akkus Ihrer App dar. Um die mit der Netzwerkaktivität verbundene Akkuentladung zu minimieren, ist es wichtig, dass Sie verstehen, wie sich Ihr Verbindungsmodell auf die zugrunde liegende Funkhardware auswirkt.

In diesem Abschnitt wird der Funkzustandsautomat vorgestellt und erläutert, wie das Verbindungsmodell Ihrer App mit ihm interagiert. Dann werden verschiedene Techniken angeboten, die die Auswirkungen der Datennutzung Ihrer App auf den Akku minimieren können.

Die Funkstatusmaschine

Die kabellose Funkschnittstelle auf dem Gerät Ihres Nutzers verfügt über integrierte Energiesparfunktionen, die dazu beitragen, den Akkuverbrauch zu minimieren. Wenn das kabellose Funkgerät vollständig aktiv ist, verbraucht es viel Strom. Ist es inaktiv oder im Stand-by-Modus, verbraucht es nur sehr wenig Strom.

Ein wichtiger Faktor ist, dass der Radiosender nicht sofort aus dem Standby-Modus auf voll aktiver werden kann. Beim „Einschalten“ des Funkgeräts entsteht eine Latenzzeit. Der Akku wechselt also langsam von einem Zustand mit einem höheren Energiebedarf zu einem Energiezustand mit geringerem Stromverbrauch, um Energie zu sparen, wenn er nicht verwendet wird. Gleichzeitig wird versucht, die mit dem „Hochfahren“ des Funkgeräts verbundene Latenz zu minimieren.

Der Zustandsautomat für eine typische 3G-Netzwerkfunkschnittstelle besteht aus drei Energiezuständen:

  • Volle Power: Wird verwendet, wenn eine Verbindung aktiv ist, sodass das Gerät Daten mit der höchstmöglichen Geschwindigkeit übertragen kann.
  • Niedriger Energieverbrauch: Ein Zwischenzustand, bei dem der Akkuverbrauch um etwa 50 % reduziert wird.
  • Stand-by: Der minimale Stromverbrauchsstatus, in dem keine Netzwerkverbindung aktiv ist.

Der niedrige Status und der Stand-by-Status belasten den Akku zwar deutlich, führen aber auch zu einer erheblichen Latenz bei Netzwerkanfragen. Die Rückkehr aus dem niedrigen Zustand zu voller Energie dauert etwa 1, 5 Sekunden.Der Wechsel vom Stand-by-Modus zur vollen Leistung kann mehr als 2 Sekunden dauern.

Zur Minimierung der Latenz verwendet die Zustandsmaschine eine Verzögerung, um den Übergang in Zustände mit niedriger Energie zu verschieben. In Abbildung 1 werden die Timings von AT&T für eine typische 3G-Funkschnittstelle verwendet.


Abbildung 1: Typisches drahtloses 3G-Funkgerät.

Der Funkzustandsautomat auf jedem Gerät, insbesondere die damit verbundene Übergangsverzögerung ("Endezeit") und Startlatenz, variiert je nach der verwendeten drahtlosen Funktechnologie (3G, LTE, 5G usw.) und wird vom Netz des Mobilfunkanbieters definiert und konfiguriert, in dem das Gerät betrieben wird.

Auf dieser Seite wird anhand der von AT&T bereitgestellten Daten ein repräsentativer Zustandsautomat für ein typisches drahtloses 3G-Funkgerät beschrieben. Die allgemeinen Prinzipien und die daraus resultierenden Best Practices gelten jedoch für alle WLAN-Implementierungen.

Diese Methode ist besonders effektiv für das typische Surfen im mobilen Web, da dadurch unerwünschte Latenz beim Surfen im Internet verhindert wird. Die relativ kurze Extremwertzeit sorgt auch dafür, dass das Radio nach Abschluss einer Browsersitzung in einen niedrigeren Energiezustand wechseln kann.

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

So wirken sich Apps auf den Radiostatus aus

Jedes Mal, wenn Sie eine neue Netzwerkverbindung herstellen, wechselt die Funkanlage in den vollen Power-Zustand. Bei dem oben beschriebenen typischen 3G-Funkgerät, das zuvor beschrieben wurde, bleibt es für die Dauer der Übertragung mit voller Energie – plus weitere 5 Sekunden am Ende –, gefolgt von 12 Sekunden im niedrigen Energiezustand. Bei einem typischen 3G-Gerät verbraucht das Funkgerät also bei jeder Datenübertragungssitzung mindestens 18 Sekunden lang Energie.

In der Praxis bedeutet dies, dass eine Anwendung, die dreimal pro Minute eine Datenübertragung von einer Sekunde durchführt, die drahtlose Funkschnittstelle dauerhaft aktiv hält, sodass sie wieder in den Hochleistungsmodus wechselt, so wie sie in den Standby-Modus wechselt.


Abbildung 2: Relativer Verbrauch drahtloser Funkleistung bei einer Übertragung von einer Sekunde, die dreimal pro Minute ausgeführt wird. In der Abbildung ist die Latenz beim Hochfahren zwischen Ausführungen nicht enthalten.

Wenn dagegen dieselbe Anwendung ihre Datenübertragungen bündelt und jede Minute eine einzige Übertragung von drei Sekunden durchführt, würde dies die Funkleistung für insgesamt nur 20 Sekunden pro Minute beibehalten. Dadurch kann die Funkanlage jede Minute 40 Sekunden lang im Stand-by sein, was zu einer deutlichen Reduzierung des Akkuverbrauchs führt.


Abbildung 3: Relativer Energieverbrauch drahtloser Funkverbindungen für Übertragungen von drei Sekunden, die einmal pro Minute ausgeführt werden.

Optimierungstechniken

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

Bundle-Datenübertragungen

Wie im vorherigen Abschnitt erwähnt, ist das Bündeln der Datenübertragungen, sodass Sie mehr Daten seltener übertragen, eine der besten Möglichkeiten zur Verbesserung der Akkueffizienz.

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

Daten-Prefetch

Der Vorabruf von Daten ist eine weitere effektive Möglichkeit, die Anzahl der unabhängigen Datenübertragungssitzungen zu reduzieren, die Ihre Anwendung ausführt. Wenn der Nutzer beim Vorabruf eine Aktion in Ihrer Anwendung ausführt, prognostiziert die Anwendung, welche Daten höchstwahrscheinlich für die nächste Reihe von Nutzeraktionen benötigt werden, und ruft diese Daten in einem einzigen Burst über eine einzige Verbindung bei voller Kapazität ab.

Durch das Frontloading Ihrer Übertragungen reduzieren Sie die Anzahl der Funkaktivierungen, die zum Herunterladen der Daten erforderlich sind. Dies schont nicht nur die Akkulaufzeit, sondern verbessert auch die Latenz, verringert die erforderliche Bandbreite und die Downloadzeiten.

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

Hier ein Beispiel aus der Praxis.

Nachrichtenleser

Viele Nachrichten-Apps versuchen, die Bandbreite zu reduzieren, indem Schlagzeilen erst heruntergeladen werden, nachdem eine Kategorie ausgewählt wurde, vollständige Artikel nur, wenn der Nutzer sie lesen möchte, und Miniaturansichten, während sie in den sichtbaren Bereich scrollen.

Bei diesem Ansatz muss das Radio für die Mehrheit der Nachrichtensitzungen aktiviert bleiben, während Nutzer die Schlagzeilen scrollen, die Kategorien ändern oder Artikel lesen. Der ständige Wechsel zwischen den Energiezuständen führt nicht nur zu einer erheblichen Latenz, wenn Kategorien gewechselt oder Artikel gelesen werden.

Ein besserer Ansatz besteht darin, beim Start eine angemessene Menge an Daten vorab abzurufen. Beginnen Sie dabei mit dem ersten Satz von Schlagzeilen und Miniaturansichten, wobei für eine Startzeit mit niedriger Latenz gesorgt wird. Fahren Sie dann mit den verbleibenden Schlagzeilen und Miniaturansichten sowie dem Artikeltext für jeden Artikel fort, der mindestens aus der primären Liste der Schlagzeilen verfügbar ist.

Eine weitere Alternative besteht darin, alle Überschriften, Miniaturansichten, Artikeltexte und möglicherweise sogar vollständige Artikelbilder vorab abzurufen – in der Regel im Hintergrund und nach einem vorab festgelegten Zeitplan. Bei diesem Ansatz besteht die Gefahr, dass beim Herunterladen von Inhalten, die nie verwendet werden, eine erhebliche Bandbreite und Akkulaufzeit erforderlich ist. Daher sollte er mit Vorsicht implementiert werden.

Weitere Überlegungen

Der Vorabruf von Daten hat zwar viele Vorteile, aber ein zu aggressiver Einsatz des Vorabrufs birgt auch das Risiko einer erhöhten Akkuentladung, einer erhöhten Bandbreitennutzung sowie des Downloadkontingents, da nicht genutzte Daten heruntergeladen werden. Außerdem muss der Vorabruf den Start der Anwendung nicht verzögern, während die Anwendung auf den Abschluss des Prefetch-Vorgangs wartet. In der Praxis kann dies bedeuten, dass Daten schrittweise verarbeitet oder aufeinanderfolgende Übertragungen priorisiert werden, sodass die für den Start der Anwendung 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 ab, dass sie verwendet werden. Als grober Leitfaden können Sie basierend auf dem oben beschriebenen Zustandsautomaten für Daten, bei denen die Wahrscheinlichkeit, dass sie in der aktuellen Nutzersitzung verwendet werden, 50% betragen, in der Regel etwa 6 Sekunden lang (ungefähr 1–2 Megabyte) im Voraus abrufen, bevor die potenziellen Kosten für das Herunterladen nicht verwendeter Daten den möglichen Einsparungen entsprechen, wenn Sie diese Daten nicht herunterladen.

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

Nach diesem Prinzip sollten große Downloads, z. B. Videodateien, in regelmäßigen Abständen (alle 2 bis 5 Minuten) heruntergeladen werden, wobei praktisch nur die Videodaten vorab abgerufen werden, die wahrscheinlich in den nächsten Minuten angezeigt werden.

Eine Lösung besteht darin, den vollständigen Download so zu planen, dass er nur bei einer WLAN-Verbindung und eventuell nur dann ausgeführt wird, wenn das Gerät geladen wird. Die WorkManager API unterstützt genau diesen Anwendungsfall. Sie ermöglicht es Ihnen, die Arbeit im Hintergrund zu beschränken, bis das Gerät die vom Entwickler festgelegten Kriterien erfüllt, z. B. Aufladen und WLAN-Verbindung.

Prüfen Sie die Verbindung, bevor Sie Anfragen stellen

Die Suche nach einem Mobilfunksignal ist eine der energiesparendsten Vorgänge auf einem Mobilgerät. Eine Best Practice für vom Nutzer initiierte Anfragen besteht darin, zuerst mit ConnectivityManager zu prüfen, ob eine Verbindung vorhanden ist, wie unter Verbindungsstatus und Verbindungsmessung überwachen beschrieben. Wenn kein Netzwerk vorhanden ist, kann die App den Akku schonen, indem sie die Suche über das Mobilfunknetz nicht erzwungen. Die Anfrage kann dann geplant und beim Herstellen einer Verbindung in einem Batch mit anderen Anfragen ausgeführt werden.

Poolverbindungen

Eine weitere Strategie, die neben der Batchverarbeitung und dem Prefetching hilfreich sein kann, besteht darin, die Netzwerkverbindungen Ihrer Anwendung in einem Pool zusammenzuführen.

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 standardmäßig das Verbindungs-Pooling und verwenden dieselbe Verbindung für mehrere Anfragen wieder.

Zusammenfassung und Blick in die Zukunft

In diesem Abschnitt haben Sie viel über WLAN und einige Strategien gelernt, die Sie allgemein anwenden können, um eine schnelle, reaktionsschnelle 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.