Android 11 oder höher unterstützt das Generieren von Boot-Image-Profilen, die Informationen zum Code verschiedener Komponenten auf Systemebene wie Systemserver und Boot-Classpath enthalten. Die Android Runtime (ART) verwendet diese Informationen, um systemweite Optimierungen durchzuführen. Einige davon sind für die Leistung von Android entscheidend und wirken sich auf die Ausführung aller nicht nativen Codes (auf System- oder App-Ebene) aus. In einigen Fällen können Boot-Image-Profile die Ausführungsleistung und den Speicherverbrauch um zweistellige Prozentsätze beeinträchtigen.
Informationen zum Bootprofil abrufen
Boot-Image-Profile werden aus den Profilen von Apps abgeleitet, die während kritischer User Journeys (CUJs) ausgeführt werden. In einer bestimmten Gerätekonfiguration erfasst ART (als Teil der JIT-Profile) die von Apps verwendeten Boot-Classpath-Methoden und ‑Klassen und zeichnet diese Informationen im App-Profil (z. B. /data/misc/profiles/cur/0/com.android.chrome/primary.prof
) auf, wo sie durch die Boot-Classpath-DEX-Datei (Dalvik EXecutable) indexiert werden (siehe ART-Profilformat).
Sehen Sie sich die App-Profile an, die während der CUJs erfasst wurden, um zu ermitteln, welcher Teil des Boot-Classpaths am häufigsten verwendet wird und am wichtigsten für die Optimierung ist. Weitere Informationen finden Sie unter ART-Profilformat. Wenn Sie alle Methoden oder Klassen einbeziehen, wirkt sich das negativ auf die Leistung aus. Konzentrieren Sie sich daher auf die am häufigsten verwendeten Codepfade. Wenn eine Methode aus dem Boot-ClassPath beispielsweise von einer einzelnen App verwendet wird, sollte sie nicht Teil der Boot-Profile sein. Die Auswahl der Methode/Klasse sollte für jedes Gerät basierend auf der Auswahl der CUJ und der Menge der beim Testen generierten Daten konfiguriert werden.
Wenn Sie Informationen zum Boot-ClassPath aus allen einzelnen App-Profilen auf dem Gerät zusammenfassen möchten, führen Sie den Befehl adb shell cmd package snapshot-profile android
aus. Sie können die aggregierten Informationen als Grundlage für die Verarbeitung und die Auswahl der Methode/Klasse verwenden, ohne einzelne Profile manuell zu aggregieren. Das ist aber auch möglich.
Abbildung 1: Profile für Boot-Images abrufen
Profildaten des Boot-Images
Boot-Image-Profile enthalten die folgenden Dateien und Daten.
Profil für den Boot-Classpath (
frameworks/base/config/boot-image-profile.txt
). Gibt an, welche Methoden aus dem Boot-Classpath optimiert werden, welche Klasse im Boot-.art
-Image enthalten ist und wie die entsprechenden DEX-Dateien angeordnet sind.Liste der vorgelagerten Klassen. Bestimmt, welche Klassen in Zygote vorab geladen werden.
Profil für die Systemserverkomponenten (
frameworks/base/services/art-profile
). Gibt an, welche Methoden vom Systemserver optimiert/kompiliert werden, welche Klasse im Boot-.art
-Image enthalten ist und wie die entsprechenden DEX-Dateien angeordnet sind.
ART-Profilformat
Das ART-Profil erfasst Informationen aus jeder der geladenen DEX-Dateien, einschließlich Informationen zu Methoden, die optimiert werden sollten, und Klassen, die beim Start verwendet werden. Wenn das Profiling des Boot-Images aktiviert ist, nimmt ART auch die JAR-Dateien für den Boot-Classpath und den Systemserver in das Profil auf und kommentiert jede DEX-Datei mit dem Namen des Pakets, das sie verwendet.
Sie können das Profil des Roh-Boot-Images beispielsweise mit dem folgenden Befehl dumpen:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof
Die Ausgabe sollte in etwa so aussehen:
=== Dex files ===
=== profile ===
ProfileInfo [012]
core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
hot methods: 520[], 611[] …
startup methods: …
classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
hot methods: 520[], 521[]…
startup methods: …
classes: …
Im obigen Beispiel:
core-oj.jar
wird voncom.google.android.ext.services
undcom.android.systemui
verwendet. In jedem Eintrag sind die beiden voncore-oj.jar
verwendeten Pakete aufgeführt.Beide Prozesse verwenden die Methode mit dem DEX-Index 520, aber nur der
systemui
-Prozess verwendet die Methode mit dem DEX-Index 521. Dasselbe gilt für die anderen Profilabschnitte (z. B. die Startklassen).
Filtern Sie während der Datenverarbeitung Methoden/Klassen basierend auf der Nutzung und priorisieren Sie Prozesse auf Systemebene (z. B. den Systemserver oder systemui
) oder Methoden, die zwar nicht häufig verwendet werden, aber dennoch wichtig sind (z. B. Methoden, die von der Kamera-App verwendet werden).
Im Profilformat werden intern mehrere Flags (Start, Nach dem Start, Hotness, ABI) für jede Methode angegeben, mehr als im Dump-Format. Wenn Sie alle Signale nutzen möchten, ändern Sie die verfügbaren Scripts.
Empfehlungen
Beachten Sie die folgenden Richtlinien, um optimale Ergebnisse zu erzielen.
Implementieren Sie die Konfiguration zum Generieren von Boot-Image-Profilen auf mehreren Testgeräten und aggregieren Sie die Ergebnisse, bevor Sie das endgültige Boot-Image-Profil generieren. Das
profman
-Tool unterstützt die Aggregation und Auswahl mehrerer Boot-Image-Profile, funktioniert jedoch nur mit derselben Version des Boot-Images (demselben Boot-Classpath).Weisen Sie den Methoden/Klassen, die von Systemprozessen verwendet werden, eine höhere Auswahlpriorität zu. Diese Methoden/Klassen verwenden möglicherweise Code, der von anderen Apps nicht oft verwendet wird, aber dennoch wichtig für die Optimierung ist.
Die Datenform bei einem einzelnen Gerätelauf sieht sehr anders aus als bei Testgeräten, auf denen realistische CUJs ausgeführt werden. Wenn Sie nicht viele Testgeräte haben, verwenden Sie dasselbe Gerät, um mehrere CUJs auszuführen, um die Wahrscheinlichkeit zu erhöhen, dass die Optimierungen des Boot-Image-Profils in der Produktion gut funktionieren. Dieses Szenario wird unten beschrieben.
Geräte konfigurieren
Verwenden Sie eine der folgenden Methoden, um die Konfiguration des Bootprofils über Systemeigenschaften zu aktivieren.
Option 1:Props manuell einrichten (funktioniert bis zum Neustart):
adb root
adb shell stop
adb shell setprop dalvik.vm.profilebootclasspath true
adb shell setprop dalvik.vm.profilesystemserver true
adb shell start
Option 2:Verwenden Sie ein
local.prop
(dauerhafter Effekt, bis die Datei gelöscht wird). Gehen Sie dazu folgendermaßen vor:Erstellen Sie eine
local.prop
-Datei mit folgendem Inhalt:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
Führen Sie folgende Befehle aus:
adb push local.prop /data/
adb shell chmod 0750 /data/local.prop
adb reboot
Option 3:Über die Gerätekonfiguration die folgenden serverseitigen Eigenschaften festlegen:
persist.device_config.runtime_native_boot.profilesystemserver persist.device_config.runtime_native_boot.profilebootclasspath`
Boot-Image-Profile generieren
Folgen Sie der Anleitung unten, um ein einfaches Boot-Image-Profil zu generieren, indem Sie Tests auf einem einzelnen Gerät ausführen.
Richten Sie das Gerät ein.
Konfigurieren Sie das Gerät wie unter Geräte konfigurieren beschrieben.
Optional: Es dauert einige Zeit, bis die anderen Profile mit dem neuen Profilformat bereinigt und ersetzt wurden. Wenn Sie die Profilerfassung beschleunigen möchten, setzen Sie alle Profile auf dem Gerät zurück.
adb shell stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
Führen Sie die CUJs auf dem Gerät aus.
Erfassen Sie das Profil mit dem folgenden Befehl:
adb shell cmd package snapshot-profile android
Extrahieren Sie das Profil mit dem folgenden Befehl:
adb pull /data/misc/profman/android.prof
Rufen Sie die JAR-Dateien des Boot-Klassenpfads mit den folgenden Befehlen auf:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
Generieren Sie das Boot-Image-Profil mit dem folgenden
profman
-Befehl.profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
Passen Sie den Befehl
profman
mithilfe der verfügbaren Flags für den Auswahlgrenzwert an die Daten an.--method-threshold
--class-threshold
--clean-class-threshold
--preloaded-class-threshold
--upgrade-startup-to-hot
--special-package
Eine vollständige Liste findest du auf der Hilfeseite zu
profman
oder im Quellcode.