Android 11 oder höher unterstützt die Generierung von Boot-Image-Profilen, die Informationen zum Code verschiedener Systemkomponenten wie dem Systemserver und dem Boot-Klassenpfad enthalten. Die Android Runtime (ART) verwendet diese Informationen, um systemweite Optimierungen vorzunehmen, von denen einige für die Leistung von Android entscheidend sind und sich auf die Ausführung aller nicht nativen Codes (System- oder App-Ebene) auswirken. In einigen Fällen können Boot-Image-Profile die Ausführungsleistung und den Speicherverbrauch um zweistellige Prozentsätze beeinflussen.
Informationen zum Boot-Profil abrufen
Boot-Image-Profile werden aus den Profilen von Apps abgeleitet, die während wichtiger Nutzerverhaltens (Critical User Journeys, CUJs) ausgeführt werden. In einer bestimmten Gerätekonfiguration erfasst ART
(als Teil der JIT-Profile) die Boot-Klassenpfadmethoden und -klassen, die von
Apps verwendet werden, und speichert diese Informationen im App-Profil (z. B.
/data/misc/profiles/cur/0/com.android.chrome/primary.prof), wo sie
durch die Dalvik EXecutable-Datei (DEX) des Boot-Klassenpfads indexiert werden (siehe ART-Profil
format).
Prüfen Sie die während der CUJs aufgezeichneten App-Profile, um zu ermitteln, welcher Teil des Boot Klassenpfads am häufigsten verwendet wird und am wichtigsten für die Optimierung ist (ein Beispiel 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 beispielsweise eine Methode aus dem Boot-Klassenpfad von einer einzelnen App verwendet wird, sollte sie nicht Teil der Boot-Profile sein. Bei jedem Gerät sollte die Auswahl der Methode/Klasse auf der CUJ-Auswahl und der Menge der durch Tests erzeugten Daten basieren.
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 zusammengefassten Informationen als Grundlage für die Verarbeitung und Auswahl von Methoden/Klassen verwenden, ohne einzelne Profile manuell zusammenzufassen (was aber möglich ist).
Abbildung 1 : Prozess zum Abrufen von Boot-Image-Profilen
Daten des Boot-Image-Profils
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 aus dem Boot-Klassenpfad optimiert werden und welche Klasse im Boot-.artImage enthalten ist.Liste der vorab geladenen Klassen. Bestimmt, welche Klassen in Zygote vorab geladen werden.
Profil für die Systemserverkomponenten (
frameworks/base/services/art-profile). Bestimmt, welche Methoden vom Systemserver optimiert/kompiliert werden, welche Klasse im Boot-.artImage 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 während des Starts verwendet werden. Wenn die Boot-Image-Profilerstellung aktiviert ist, enthält ART auch die JAR-Dateien des Boot-Klassenpfads und des Systemservers im Profil und versieht jede DEX-Datei mit dem Namen des Pakets, das sie verwendet.
So geben Sie beispielsweise das Rohprofil des Boot-Images mit dem folgenden Befehl aus:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.profDie Ausgabe sieht in etwa so aus:
=== 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.jarwird voncom.google.android.ext.servicesundcom.android.systemuiverwendet. Jeder Eintrag listet die beiden Pakete auf, die auscore-oj.jarverwendet werden.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 bei der Datenverarbeitung Methoden/Klassen nach Verwendung und priorisieren Sie Prozesse auf Systemebene (z. B. den Systemserver oder systemui) oder Methoden, die möglicherweise nicht häufig verwendet werden, aber dennoch wichtig sind (z. B. Methoden, die von der Kamera-App verwendet werden).
Im Profilformat wird jede Methode intern mit mehreren Flags versehen (Start, Nach dem Start, Häufigkeit, ABI), was mehr ist, als im reinen Dump-Format angezeigt wird. Wenn Sie alle Signale nutzen möchten, ändern Sie die verfügbaren Skripts.
Empfehlungen
Beachten Sie die folgenden Richtlinien, um optimale Ergebnisse zu erzielen.
Stellen Sie die Konfiguration zum Generieren von Boot-Image-Profilen auf mehreren Testgeräten bereit und fassen Sie die Ergebnisse zusammen, bevor Sie das endgültige Boot-Image-Profil generieren. Das Tool
profmanunterstützt das Zusammenfassen und Auswählen mehrerer Boot-Image-Profile, funktioniert aber nur mit derselben Version des Boot-Images (derselbe Boot-Klassenpfad).Priorisieren Sie bei der Auswahl 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 optimiert werden muss.
Die Datenform aus einer einzelnen Geräteausführung unterscheidet sich stark von Testgeräten, auf denen CUJs in der Praxis ausgeführt werden. Wenn Sie nicht über eine große Anzahl von Testgeräten verfügen, verwenden Sie dasselbe Gerät, um mehrere CUJs auszuführen, um die Zuverlässigkeit der Optimierungen des Boot-Image-Profils in der Produktion zu erhöhen (dieses Szenario wird unten beschrieben).
Geräte konfigurieren
Verwenden Sie eine der folgenden Methoden, um die Konfiguration des Boot-Profils über Systemeigenschaften zu aktivieren.
Option 1:Eigenschaften manuell einrichten (funktioniert bis zum Neustart):
adb rootadb shell stopadb shell setprop dalvik.vm.profilebootclasspath trueadb shell setprop dalvik.vm.profilesystemserver trueadb shell startOption 2:
local.propverwenden (dauerhafte Wirkung, bis die Datei gelöscht wird). Gehen Sie dazu so vor:Erstellen Sie eine
local.prop-Datei mit dem folgenden Inhalt:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=trueFühren Sie folgende Befehle aus:
adb push local.prop /data/adb shell chmod 0750 /data/local.propadb reboot
Option 3:Verwenden Sie die Gerätekonfiguration, um die folgenden serverseitigen Eigenschaften festzulegen:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
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 durchführen.
Gerät einrichten.
Konfigurieren Sie das Gerät wie unter Geräte konfigurieren beschrieben.
(Optional) Es dauert einige Zeit, bis das neue Profilformat die anderen Profile bereinigt und ersetzt hat. Wenn Sie die Profilerfassung beschleunigen möchten, setzen Sie alle Profile auf dem Gerät zurück.
adb shell stopadb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"adb shell startFühren Sie die CUJs auf dem Gerät aus.
Erfassen Sie das Profil mit dem folgenden Befehl:
adb shell cmd package snapshot-profile androidExtrahieren Sie das Profil mit dem folgenden Befehl:
adb pull /data/misc/profman/android.profRufen Sie die JAR-Dateien des Boot-Klassenpfads mit den folgenden Befehlen auf:
m distls $ANDROID_PRODUCT_OUT/boot.zipGenerieren 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 den
profman-Befehl mit den verfügbaren Flags für den Auswahlgrenzwert.--method-threshold--class-threshold--clean-class-threshold--preloaded-class-threshold--upgrade-startup-to-hot--special-package
Die vollständige Liste finden Sie auf der Hilfeseite zu
profmanoder im Quellcode.