Wenn Sie die Energieversorgung und Leistung von Android-Geräten verwalten, können Apps auf einer Vielzahl von Hardware konsistent und reibungslos ausgeführt werden. Unter Android 7.0 und höher können OEMs Unterstützung für Hinweise zur nachhaltigen Leistung implementieren, mit denen Apps eine gleichbleibende Geräteleistung aufrechterhalten und einen exklusiven Kern angeben können, um die Leistung für CPU-intensive Apps im Vordergrund zu verbessern.
Langfristige Leistung
Bei lang laufenden Apps (Spiele, Kamera, RenderScript, Audioverarbeitung) kann die Leistung stark variieren, wenn die Temperaturgrenzwerte des Geräts erreicht und die SoC-Engines (System on Chip) gedrosselt werden. App-Entwickler, die leistungsstarke, langlebige Apps erstellen, sind eingeschränkt, da die Funktionen der zugrunde liegenden Plattform ein sich bewegendes Ziel sind, wenn sich das Gerät erwärmt.
Um diese Einschränkungen zu beheben, wurde in Android 7.0 die Unterstützung für eine konstante Leistung eingeführt. So können OEMs Hinweise zur Geräteleistung für langlaufende Apps geben. App-Entwickler können diese Hinweise nutzen, um Apps für eine vorhersehbare, gleichbleibende Geräteleistung über einen längeren Zeitraum hinweg zu optimieren.
Architektur
Eine Android-App kann die Plattform auffordern, in einen Modus mit gleichbleibender Leistung zu wechseln, in dem das Android-Gerät über einen längeren Zeitraum hinweg eine konstante Leistung aufrechterhalten kann.
Abbildung 1: Architektur für den Modus mit konstanter Leistung
Implementierung
Um eine gleichbleibende Leistung unter Android 7.0 und höher zu ermöglichen, müssen OEMs Folgendes tun:
- Nehmen Sie gerätespezifische Änderungen an der HAL für die Stromversorgung vor, um entweder die maximalen CPU-/GPU-Frequenzen zu sperren oder andere Optimierungen vorzunehmen, um eine thermische Drosselung zu verhindern.
- Implementieren Sie den neuen Hinweis
POWER_HINT_SUSTAINED_PERFORMANCE
in der HAL für die Stromversorgung. - Deklarieren Sie die Unterstützung, indem Sie über die
isSustainedPerformanceModeSupported()
API TRUE zurückgeben. Window.setSustainedPerformanceMode
implementieren.
In der Nexus-Referenzimplementierung begrenzt der Energiehinweis die maximalen Taktfrequenzen der CPU und GPU auf die höchsten nachhaltigen Werte. Beachten Sie, dass sich durch das Absenken der MAX-Leiste bei der CPU-/GPU-Frequenz die Framerate verringert. Diese niedrigere Rate wird in diesem Modus jedoch aufgrund ihrer Nachhaltigkeit bevorzugt. Ein Gerät mit normaler maximaler Taktfrequenz kann beispielsweise einige Minuten lang mit 60 FPS rendern, aber nachdem es sich erwärmt hat, wird die Taktfrequenz nach 30 Minuten auf 30 FPS gedrosselt. Im Dauermodus kann das Gerät beispielsweise 30 Minuten lang durchgehend mit 45 fps rendern. Ziel ist eine Framerate, die bei Verwendung des Modus mindestens so hoch (oder höher) ist wie die Framerate ohne Modus und im Zeitverlauf konstant bleibt, damit Entwickler nicht einem sich bewegenden Ziel hinterherlaufen müssen.
Wir empfehlen dringend, den Dauermodus so zu implementieren, dass das Gerät die höchstmögliche dauerhafte Leistung erreicht – nicht nur die Mindestwerte, die zum Bestehen des Tests erforderlich sind. Wählen Sie beispielsweise die höchstmöglichen MAX-Frequenzgrenzwerte aus, die nicht dazu führen, dass das Gerät im Laufe der Zeit thermisch gedrosselt wird.
Hinweis: Das Begrenzen der MAX-Taktfrequenzen ist nicht erforderlich, um den Dauermodus zu implementieren.
Zertifizierungsstufe
OEMs können einen CTS-Test (Android 7.0 und höher) verwenden, um ihre Implementierung der API für nachhaltige Leistung zu überprüfen. Dabei wird eine Arbeitslast etwa 30 Minuten lang ausgeführt und die Leistung mit und ohne aktivierten Dauermodus verglichen:
- Wenn der Modus „Dauerhaft“ aktiviert ist, muss die Framerate relativ konstant bleiben. Im Test wird die prozentuale Änderung der Framerate im Zeitverlauf gemessen und eine Änderung von weniger als 5% ist erforderlich.
- Wenn der Modus „Dauerhaft“ aktiviert ist, darf die Framerate nicht niedriger sein als die Framerate nach 30 Minuten, wenn der Modus deaktiviert ist.
Außerdem können Sie Ihre Implementierung manuell mit mehreren CPU- und GPU-intensiven Arbeitslasten testen, um sicherzustellen, dass das Gerät nach 30 Minuten Nutzung nicht thermisch gedrosselt wird. Bei internen Tests haben wir Beispielarbeitslasten wie Spiele und Benchmarking-Apps (z.B. gfxbench) verwendet.
Exklusive Kerne
Bei CPU-intensiven, zeitkritischen Arbeitslasten kann es entscheidend sein, ob ein Thread von einem anderen Thread unterbrochen wird, um die Frame-Termine einzuhalten oder nicht. Bei Apps mit strengen Anforderungen an Latenz und Framerate (z. B. Audio- oder Virtual-Reality-Apps) kann ein exklusiver CPU-Kern eine akzeptable Leistung gewährleisten.
Auf Geräten mit Android 7.0 oder höher kann jetzt ein Kern explizit für die App im Vordergrund reserviert werden. Dadurch wird die Leistung aller Apps im Vordergrund verbessert und Apps mit hoher Arbeitsintensität erhalten mehr Kontrolle darüber, wie ihre Arbeit auf die CPU-Kerne verteilt wird.
So unterstützen Sie einen exklusiven Kern auf einem Gerät:
- Aktivieren Sie
cpusets
und konfigurieren Sie einecpuset
, die nur die oberste App im Vordergrund enthält. - Achten Sie darauf, dass ein Kern (dies ist der exklusive Kern) für Threads aus dieser
cpuset
reserviert ist. - Implementieren Sie die getExclusiveCores API, um die Kernnummer des exklusiven Kerns zurückzugeben.
Um festzustellen, welche Prozesse auf welchen Kernen geplant sind, verwenden Sie systrace
, während Sie eine beliebige Arbeitslast ausführen, und prüfen Sie, ob keine Userspace-Threads von Apps außer der App im Vordergrund auf dem exklusiven Kern geplant sind.
Eine Referenzimplementierung für Nexus 6P findest du unter android//device/huawei/angler/power/power.c
.