Leistungsstatistik HAL

Die Leistung des Gerätesubsystems wird häufig in einer Laborumgebung für verschiedene Dauerzustände gemessen und aufgezeichnet, z. B. wenn der Bildschirm eingeschaltet ist oder sich das Gerät im Ruhezustand befindet. Dies funktioniert für Subsysteme mit konstantem Stromverbrauch oder unter Bedingungen, die in Laborumgebungen leicht gemessen werden können, jedoch nicht für bestimmte Anwendungsfälle, beispielsweise wenn auf einem Bildschirm ein Video angezeigt wird.

IPower.hal 1.0 bietet eine Schnittstelle zur Weitergabe von Leistungshinweisen und zur Meldung kumulativer Daten zu Schlafzustandsmetriken des Subsystems. In Android 10 und höher befindet sich die kumulative Statistikberichtsfunktion in den IPowerStats.hal -APIs für die Energiestatistiksammlung und bietet eine Möglichkeit, Energieverbrauchsdaten auf dem Gerät abzurufen. Dies ersetzt den kumulativen Statistikerfassungsteil der IPower.hal Schnittstelle für eine klarere Trennung der Funktionalität.

Die Messwerte des IPowerStats Dienstes sind nicht regelmäßig. Sie treten in entscheidenden Momenten auf, beispielsweise wenn der Akku um 1 % nachlässt. Die Messwerte werden seltener angezeigt, wenn die Batterieentladung niedrig ist, und häufiger, wenn sie hoch ist. Daten können an Server zurückgesendet und in Fehlerberichten zur Analyse und Triage verwendet werden. Dies unterstützt die laufenden Bemühungen, den Stromverbrauch zu senken und die Batterielebensdauer zu verlängern.

IPower.hal und IPowerStats.hal

Sowohl die IPower.hal als auch IPowerStats.hal Schnittstelle sind auf Android 10 verfügbar, die IPower.hal Statistikerfassungsfunktionalität ist jedoch nur über die IPowerStats.hal Schnittstelle verfügbar. Die IPowerStats.hal -Funktionalität umfasst APIs zum Erfassen und Verwenden von Daten, die aus Leistungsmessungen auf dem Gerät für unterstützte Geräte gesammelt wurden:

  • Führt Energiemessungen auf Schienenebene sowohl für Niederfrequenz- ( getRailInfo ) als auch für Hochfrequenz- ( streamEnergyData ) Clients durch und meldet die seit dem Start akkumulierte Energie.
  • Meldet Informationen zu jeder unterstützten PowerEntity , für die Daten verfügbar sind. Eine PowerEntity ist ein Plattformsubsystem, ein Peripheriegerät oder eine Energiedomäne, die sich auf den Gesamtstromverbrauch des Geräts auswirkt.
  • Meldet den Satz von Energieentitätszuständen ( getPowerEntityStateInfo ), für die die angegebenen Entitäten Residenzdaten bereitstellen, und meldet dann die akkumulierten Daten für jede angegebene PowerEntity .

Die IPowerStats.hal -APIs werden von den folgenden Clients verwendet:

  • Statsd , um Messwerte zum Stromverbrauch pro Schiene zu sammeln.
  • Perfetto , um den Stromverbrauch mit der CPU-Aktivität zu korrelieren.
  • Batterystats , um die Batteriezuordnung zu verbessern, indem gemessene Daten verwendet werden, anstatt den Batterieverbrauch anhand vordefinierter Konstanten in power_profile.xml.

Mit Android 10 und höher kann ein Gerätehersteller zwischen den Funktionen IPower.hal und IPowerStats.hal wählen, aber alle Clients müssen auf IPower.hal zurückgreifen, wenn IPowerStats.hal nicht implementiert ist.

IPowerStats.hal-Implementierungsoptionen

Auf Android 7 bis Android 9 sind nur die IPower.hal Funktionen verfügbar. Geräte, die auf Android 10 aktualisiert wurden, müssen über ein Hardware-Leistungsüberwachungssubsystem oder andere Mittel zur Überwachung und Aufzeichnung von Leistungsstatistiken verfügen. Einige SoCs erfassen Statistiken zum Stromverbrauch für Sie, oder Sie erhalten über Software Informationen zum Standort des Stromunternehmens. Hardware zur Leistungsüberwachung ist nur zur Unterstützung von getRailInfo() , getEnergyData() und streamEnergyData() erforderlich.

Wenn Sie IPowerStats.hal ohne Hardware zur Leistungsüberwachung implementieren, getRailInfo(), getEnergyData() und streamEnergyData() NOT_SUPPORTED zurück. Ebenso können getPowerEntityInfo(), getPowerEntityStateInfo() und getPowerEntityStateResidencyData() auch NOT_SUPPORTED zurückgeben, wenn die Verwendung nicht vorgesehen ist.

Beispiele für von den Schienenüberwachungs-APIs zurückgegebene Daten sind:

  • Die Stromschiene für das Display verbrauchte X µW.
  • Die Stromschiene für das Modem verbrauchte Y µW.

Beispiele für Daten, die von den Schlafzustands-APIs des Subsystems zurückgegeben werden, sind:

  • Das Modem war X ms lang im Ruhezustand.
  • Der SoC befand sich Y ms lang im Stromausfallzustand.
  • Die GPU befand sich für Z ms im Suspend-Zustand.

Verwenden Sie ein Hardware-Stromüberwachungssubsystem

Wenn Ihr Gerätedesign über ein Hardware-Stromüberwachungssubsystem verfügt, implementieren Sie IPowerStats.hal indem Sie einen einzelnen sysfs- Knoten erstellen, von dem PowerStats.hal Daten analysieren kann, oder indem Sie eine Sammlung von Systemaufrufen vom Typ ioctl durchführen.

Sie müssen Ihren Kernel-Treiber so implementieren, dass ein Akkumulatorüberlauf verhindert wird. Der verwendete Algorithmus hängt von Ihrem individuellen Hardware-Leistungsüberwachungs-Subsystemdesign ab, das sowohl aktuelle als auch durchschnittliche Busspannungs- und Strommessungen liefern muss. Der Kernel-Treiber muss diese Daten auf eine Weise erfassen, die die Energiespeicher nicht löscht, und er muss die akkumulierten Energiedaten für jede Subschiene seit dem Booten in Form einer 64-Bit-Variablen verwalten, die mit dem Energiemesswert von inkrementiert wird jede Akkumulatorabfrage.

Statistiken für eine bestimmte Komponente (oder optional mehrere Komponenten) müssen sich in einem einzelnen Knoten befinden. Obwohl dies keine herkömmliche Verwendung von sysfs ist (das normalerweise jeden Knoten auf einen einzelnen Wert beschränkt), stellt es sicher, dass alle Daten konsistent sind.

Design-Anleitung

  • Halten Sie die Latenz niedrig (maximal 1 ms), wenn Sie vom SYSFS- Knoten lesen oder Systemaufrufe tätigen.
  • Stellen Sie sicher, dass die Unterstützung der Statistikfunktion den Stromverbrauch nicht messbar erhöht:
    • Erhöhen Sie nicht die Aktivierung von Access Points (AP) und/oder Subsystemen, um Parameter wie die im Ruhemodus verbrachte Zeit zu verfolgen.
    • Übertragen Sie Statistiken zwischen dem App-Prozessor und der Firmware nach Möglichkeit opportunistisch mit anderem Datenverkehr.
  • Bei Bedarf kann das Subsystem folgende Treiberfunktionen nutzen:
    • Internes Zwischenspeichern von Daten, um Latenz/Wakeups auf Kosten leicht veralteter Daten zu vermeiden.
    • Durchführen einer Extrapolation, wenn das Subsystem im Ruhezustand ist, um eine aktualisierte Ruhezeit bereitzustellen, ohne das Subsystem aufzuwecken.

Wählen Sie Komponenten, Subsysteme und Statistiken aus

Wählen Sie bei der Auswahl der Komponenten oder Subsysteme, von denen IPowerStats.hal -Daten erfasst werden sollen, alles auf dem Gerät aus, das erheblichen Strom verbraucht (5 mA oder mehr) oder das mehrere Stromverbrauchsmodi unterstützt, wie zum Beispiel die folgenden:

  • Einzelne SoC-Subsysteme.
  • Teilsysteme, die teilweise oder vollständig außerhalb des SoC liegen, wie etwa WLAN, der Bildprozessor oder der Sicherheitsprozessor.
  • Peripheriegeräte wie Hochleistungs-LEDs und Kameras.
  • Leistungsdomänen, die unterschiedliche Modi verwenden (z. B. die Leistungsdomäne für das SoC als Ganzes).

Anpassung

Diese optionale Funktion kann individuell angepasst werden. Entwerfen Sie Anwendungsfälle und passen Sie Ihre Nutzung an:

  • Entscheiden Sie, welche Schienen gemessen werden sollen und wie oft.
  • Entscheiden Sie, wann Sie die Daten lesen und wie Sie sie interpretieren.
  • Entscheiden Sie anhand Ihrer Daten, welche Maßnahmen wann ergriffen werden sollen.

Validierung

VTS-Tests stellen sicher, dass die Android-Anforderungen erfüllt werden. Die Kommentare in IPowerStats.hal werden zur Überprüfung der Konformität eines Geräts verwendet.

Wenn Sie beispielsweise getRailInfo() aufrufen und es nichts zurückgibt, schlägt der VTS-Test fehl, weil Sie keine Informationen über die überwachten Schienen erhalten haben oder den Status SUCCESS zurückgegeben haben. Ebenso ist es ein Fehler, wenn Sie Bahninformationen erhalten haben, diese jedoch von einer NON_SUPPORTED oder FILE_SYSTEM_ERROR -Antwort begleitet wurden. Das VTS überprüft anhand der Anforderungen in den Kommentaren IPower.hal und IPowerStats.hal, ob die Spezifikation des Geräteherstellers in der HAL-Datei eingehalten wird. Ein Beispiel für Kommentare, die bei VTS-Tests verwendet werden, ist unten dargestellt:

/**
* Rail information:
* Reports information related to the rails being monitored.
*
* @return rails Information about monitored rails.
* @return status SUCCESS on success or NOT_SUPPORTED if
* feature is not enabled or FILESYSTEM_ERROR on filesystem nodes
* access error.
*/
getRailInfo()
generates(vec<e;RailInfo>e; rails, Status status);