Die Nutzung der Funkschnittstelle zur Datenübertragung ist möglicherweise eine der größten Ursachen für die schnelle Akkuentladung Ihrer App. Um die Akkuentladung im Zusammenhang mit Netzwerkaktivitäten zu minimieren, ist es wichtig zu verstehen, wie sich Ihr Konnektivitätsmodell auf die zugrunde liegende Funkhardware auswirkt.
In diesem Abschnitt wird die Zustandsmaschine für die Funkschnittstelle vorgestellt und erläutert, wie das Konnektivitätsmodell Ihrer App damit interagiert. Anschließend werden mehrere Techniken vorgestellt, die Ihnen helfen, die Auswirkungen des Datenverbrauchs Ihrer App auf den Akku zu minimieren.
Die Zustandsmaschine für den Mobilfunk
Die Funkschnittstelle auf dem Gerät Ihres Nutzers verfügt über integrierte Energiesparfunktionen, die den Akkuverbrauch minimieren. Wenn die Funkschnittstelle vollständig aktiv ist, verbraucht sie viel Strom. Wenn sie inaktiv oder im Standby-Modus ist, verbraucht sie nur sehr wenig Strom.
Ein wichtiger Faktor ist, dass die Funkschnittstelle nicht sofort vom Standby-Modus in den vollständig aktiven Modus wechseln kann. Es gibt eine Latenzzeit, die mit dem „Hochfahren“ der Funkschnittstelle verbunden ist. Der Akku wechselt also langsam von höheren zu niedrigeren Energiezuständen, um Strom zu sparen, wenn er nicht verwendet wird. Gleichzeitig wird versucht, die Latenz beim „Hochfahren“ des Mobilfunks zu minimieren.
Die Zustandsmaschine für eine typische 3G-Funkschnittstelle besteht aus drei Energiezuständen:
- Volle Leistung: Wird verwendet, wenn eine Verbindung aktiv ist, sodass das Gerät Daten mit der höchstmöglichen Geschwindigkeit übertragen kann.
- Niedrige Leistung: Ein Zwischenzustand, der den Akkuverbrauch um etwa 50 % reduziert.
- Standby: Der Zustand mit dem geringsten Stromverbrauch, in dem keine Netzwerk verbindung aktiv ist.
Die Zustände „Niedrige Leistung“ und „Standby“ verbrauchen zwar deutlich weniger Akku, führen aber auch zu einer erheblichen Latenz bei Netzwerkanfragen. Die Rückkehr von „Niedrige Leistung“ zu „Volle Leistung“ dauert etwa 1, 5 Sekunden und der Wechsel von „Standby“ zu „Volle Leistung“ kann mehr als 2 Sekunden dauern.
Um die Latenz zu minimieren, verwendet die Zustandsmaschine eine Verzögerung, um den Übergang zu niedrigeren Energiezuständen zu verschieben. In Abbildung 1 sind die Zeitangaben von AT&T für eine typische 3G-Funkschnittstelle dargestellt.
Abbildung 1. Zustandsmaschine für eine typische 3G-Funkschnittstelle
Die Zustandsmaschine für die Funkschnittstelle auf jedem Gerät, insbesondere die zugehörige Übergangsverzögerung („Tail Time“) und die Startlatenz, variiert je nach verwendeter Mobilfunktechnologie (3G, LTE, 5G usw.) und wird vom Mobilfunknetz definiert und konfiguriert, über das das Gerät betrieben wird.
Auf dieser Seite wird eine repräsentative Zustandsmaschine für eine typische 3G-Funkschnittstelle beschrieben, die auf Daten von AT&T basiert. Die allgemeinen Prinzipien und die daraus resultierenden Best Practices gelten jedoch für alle Implementierungen von Funkschnittstellen.
Dieser Ansatz ist besonders effektiv für das typische mobile Surfen im Web, da er unerwünschte Latenzen verhindert. Die relativ kurze Tail Time sorgt auch dafür, dass die Funkschnittstelle 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, bei denen Apps sowohl im Vordergrund (wo Latenz wichtig ist) als auch im Hintergrund (wo die Akkulaufzeit priorisiert werden sollte) ausgeführt werden.
Auswirkungen von Apps auf die Zustandsmaschine für die Funkschnittstelle
Jedes Mal, wenn Sie eine neue Netzwerkverbindung herstellen, wechselt die Funkschnittstelle in den Zustand „Volle Leistung“. Im Fall der zuvor beschriebenen typischen Zustandsmaschine für den 3G-Mobilfunk bleibt er für die Dauer der Übertragung auf voller Leistung – plus 5 Sekunden Tail Time – gefolgt von 12 Sekunden im Zustand „Niedrige Leistung“. Bei einem typischen 3G-Gerät verbraucht die Funkschnittstelle also bei jeder Datenübertragung 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, die Funkschnittstelle ständig aktiv hält und sie wieder auf volle Leistung setzt, sobald sie in den Stand-by-Modus wechselt.
Abbildung 2. Relativer Stromverbrauch des Mobilfunks bei einer Übertragung von einer Sekunde, die dreimal pro Minute ausgeführt wird In der Abbildung ist die Latenz beim „Hochfahren“ zwischen den Ausführungen nicht berücksichtigt.
Wenn dieselbe App die Datenübertragungen bündelt und jede Minute eine einzelne Übertragung von drei Sekunden ausführt, bleibt die Funkschnittstelle insgesamt nur 20 Sekunden pro Minute im Zustand „Volle Leistung“. So kann die Funkschnittstelle 40 Sekunden pro Minute im Standby-Modus sein, was zu einer erheblichen Reduzierung des Akkuverbrauchs führt.
Abbildung 3. Relativer Stromverbrauch des Mobilfunks bei Übertragungen von drei Sekunden, die einmal pro Minute ausgeführt werden
Optimierungstechniken
Nachdem Sie nun wissen, wie sich der Netzwerkzugriff auf die Akkulaufzeit auswirkt, möchten wir Ihnen einige Möglichkeiten vorstellen, mit denen Sie den Akkuverbrauch reduzieren und gleichzeitig eine schnelle und flüssige Nutzererfahrung bieten können.
Datenübertragungen bündeln
Wie im vorherigen Abschnitt erwähnt, ist das Bündeln von Datenübertragungen, sodass Sie seltener mehr Daten übertragen, eine der besten Möglichkeiten, die Akkueffizienz zu verbessern.
Das ist natürlich nicht immer möglich, wenn Ihre App als Reaktion auf eine Nutzeraktion sofort Daten empfangen oder senden muss. Sie können das Problem entschärfen, indem Sie Daten vorab 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 das Batching und Bündeln. Unter Von der App initiierte Aufgaben optimieren finden Sie Tipps zum Planen von Netzwerkübertragungen im Hintergrund.
Daten vorab abrufen
Das Vorabrufen von Daten ist eine weitere effektive Möglichkeit, die Anzahl der unabhängigen Datenübertragungssitzungen zu reduzieren, die Ihre App ausführt. Wenn der Nutzer in Ihrer App eine Aktion ausführt, ruft die App die Daten, die für die nächste Reihe von Nutzeraktionen am wahrscheinlichsten benötigt werden, in einem einzigen Vorgang über eine einzige Verbindung mit voller Kapazität ab.
Durch das Vorabrufen von Übertragungen reduzieren Sie die Anzahl der Funkschnittstellenaktivierungen, 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.
Das Vorabrufen von Daten verbessert auch die Nutzererfahrung, da die Latenz in der App minimiert wird, die durch das Warten auf den Abschluss von Downloads entsteht, bevor eine Aktion ausgeführt oder Daten angezeigt werden.
Hier ein praktisches Beispiel:
Ein Newsreader
Viele Nachrichten-Apps versuchen, die Bandbreite zu reduzieren, indem sie Schlagzeilen erst herunterladen, nachdem eine Kategorie ausgewählt wurde, vollständige Artikel erst, wenn der Nutzer sie lesen möchte, und Thumbnails erst, wenn sie in den sichtbaren Bereich scrollen.
Bei diesem Ansatz muss die Funkschnittstelle für die meisten Nutzer während der gesamten Sitzung zum Lesen von Nachrichten aktiv bleiben, da sie durch Schlagzeilen scrollen, Kategorien wechseln und Artikel lesen. Außerdem führt der ständige Wechsel zwischen Energiezuständen zu einer erheblichen Latenz beim Wechseln von Kategorien oder Lesen von Artikeln.
Ein besserer Ansatz ist, beim Start eine angemessene Menge an Daten vorab abzurufen, beginnend mit den ersten Schlagzeilen und Thumbnails – um eine niedrige Startlatenz zu gewährleisten – und dann mit den restlichen Schlagzeilen und Thumbnails sowie dem Artikeltext für jeden Artikel, der mindestens in der primären Schlagzeilenliste verfügbar ist.
Eine weitere Alternative ist, alle Schlagzeilen, Miniaturansichten, Artikeltexte und möglicherweise sogar Bilder für vollständige Artikel vorab abzurufen – in der Regel im Hintergrund nach einem festgelegten Zeitplan. Bei diesem Ansatz besteht das Risiko, dass viel Bandbreite und Akkulaufzeit für das Herunterladen von Inhalten aufgewendet werden, die nie verwendet werden. Er sollte daher mit Vorsicht implementiert werden.
Weitere Überlegungen
Das Vorabrufen von Daten bietet viele Vorteile. Wenn es jedoch zu aggressiv eingesetzt wird, kann es auch zu einem erhöhten Akkuverbrauch und einer höheren Bandbreitennutzung sowie zu einer Überschreitung des Downloadkontingents führen, da Daten heruntergeladen werden, die nicht verwendet werden. Außerdem muss darauf geachtet werden, dass das Vorabrufen den Start der Anwendung nicht verzögert, während die App darauf wartet, dass das Vorabrufen abgeschlossen ist. In der Praxis kann das bedeuten, dass Daten schrittweise verarbeitet werden oder aufeinanderfolgende Übertragungen so priorisiert werden, dass 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 grobe Richtlinie gilt, dass Sie basierend auf der zuvor beschriebenen Zustandsmaschine für Daten, die mit einer Wahrscheinlichkeit von 50% innerhalb der aktuellen Nutzersitzung verwendet werden, in der Regel etwa 6 Sekunden lang vorab abrufen können (ca. 1–2 Megabyte), bevor die potenziellen Kosten für das Herunterladen ungenutzter Daten den potenziellen Nutzen übersteigen, diese Daten gar nicht erst herunterzuladen.
Im Allgemeinen empfiehlt es sich, Daten so vorab abzurufen, dass Sie nur alle 2 bis 5 Minuten einen weiteren Download mit einer Größe von 1 bis 5 MB initiieren müssen.
Nach diesem Prinzip sollten große Downloads wie Videodateien in regelmäßigen Abständen (alle 2 bis 5 Minuten) in Teilen heruntergeladen werden, wobei nur die Videodaten vorab abgerufen werden, die wahrscheinlich in den nächsten Minuten 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 so einschränken, dass sie erst ausgeführt wird, wenn das Gerät die vom Entwickler angegebenen Kriterien erfüllt, z. B. wenn es geladen wird und eine WLAN-Verbindung besteht.
Vor dem Senden von Anfragen auf Konnektivität prüfen
Die Suche nach einem Mobilfunksignal ist eine der energieintensivsten Vorgänge auf einem Mobilgerät. Eine Best Practice für vom Nutzer initiierte Anfragen besteht darin, zuerst mit
einer Verbindung zu suchen, wie unter
ConnectivityManagerKonnektivitätsstatus und Verbindungs
nutzung überwachenbeschrieben.
Wenn keine Netzwerkverbindung besteht, kann die App Akku sparen, indem sie die Funkschnittstelle nicht zur Suche zwingt. Die Anfrage kann dann geplant und in einem Batch mit anderen Anfragen ausgeführt werden, wenn eine Verbindung hergestellt wird.
Verbindungen poolen
Eine zusätzliche Strategie, die neben dem Batching und Vorabrufen helfen kann, ist das Poolen der Netzwerkverbindungen Ihrer App.
Im Allgemeinen ist es effizienter, vorhandene Netzwerkverbindungen wiederzuverwenden, als neue zu initiieren. Durch die Wiederverwendung von Verbindungen kann das Netzwerk auch intelligenter auf Überlastung und damit zusammenhängende Probleme mit Netzwerkdaten reagieren.
HttpURLConnection und die meisten HTTP
Clients wie OkHttp ermöglichen standardmäßig das Poolen von Verbindungen und die Wiederverwendung derselben Verbindung für mehrere
Anfragen.
Zusammenfassung und Ausblick
In diesem Abschnitt haben Sie viel über die Funkschnittstelle und einige Strategien erfahren, die Sie allgemein anwenden können, um eine schnelle und reaktionsschnelle Nutzererfahrung zu bieten und gleichzeitig die schnelle Akkuentladung zu reduzieren.
Im nächsten Abschnitt werden wir uns drei verschiedene Arten von Netzwerkinteraktionen ansehen, die in den meisten Apps üblich sind. Sie erfahren mehr über die Treiber für jede dieser Arten sowie über moderne Techniken und APIs zum effizienten Verwalten dieser Interaktionen.