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. Android Runtime (ART) verwendet diese Informationen, um systemweite Optimierungen durchzuführen, von denen einige für die Leistung von Android entscheidend sind und die Ausführung des gesamten nicht nativen Codes (System- oder App-Ebene) beeinträchtigen. 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 Anwendungen abgeleitet, die während kritischen 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-Dalvik-Ausführbare-Datei (DEX) 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 von jedem Gerät anhand der CUJ-Auswahl und der durch Tests erzeugten Datenmenge konfiguriert werden.
Führen Sie den Befehl adb shell cmd package snapshot-profile android
aus, um Informationen zum Boot-Klassenpfad aus allen einzelnen App-Profilen auf dem Gerät zusammenzufassen. 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: Boot-Image-Profile abrufen
Profildaten des Boot-Images
Boot-Image-Profile enthalten die folgenden Dateien und Daten.
Profil für den Boot-Klassenpfad (
frameworks/base/config/boot-image-profile.txt
). Bestimmt, welche Methoden des Boot-Klassenpfads optimiert werden, welche Klasse im Boot-.art
-Image enthalten ist und wie die entsprechenden DEX-Dateien dargestellt werden.Liste der vorinstallierten 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.
Dump des unbearbeiteten Boot-Image-Profils beispielsweise mit dem folgenden Befehl:
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 gilt Folgendes:
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 Prozess
systemui
verwendet die Methode mit dem DEX-Index 521. Dieselbe Begründung 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. Ändern Sie die verfügbaren Skripts, um alle Signale zu nutzen.
Empfehlungen
Die besten Ergebnisse erzielen Sie, wenn Sie die folgenden Richtlinien beachten.
Stellen Sie die Konfiguration zum Generieren von Boot-Image-Profilen auf mehreren Testgeräten bereit und aggregieren Sie die Ergebnisse, bevor Sie das endgültige Boot-Image-Profil generieren. Das
profman
-Tool unterstützt das Aggregieren und Auswählen mehrerer Boot-Image-Profile, funktioniert aber nur mit derselben Version des Boot-Images (demselben Boot-Klassenpfad).Priorisieren Sie die Methoden/Klassen, die von Systemprozessen verwendet werden. 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 Systemattribute 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 einen
local.prop
-Effekt, bis die Datei gelöscht wird. Gehen Sie dazu so 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:Legen Sie mithilfe der Gerätekonfiguration die folgenden serverseitigen Attribute fest:
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
Gehen Sie mit den folgenden Befehlen zu den JAR-Dateien des Boot-Klassenpfads:
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=...
Optimieren Sie mithilfe von Daten den Befehl
profman
mit den verfügbaren Schwellenwert-Flags für die Auswahl.--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.