Boot-Image-Profile

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.

Boot-Image-Profil

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 von com.google.android.ext.services und com.android.systemui verwendet. In jedem Eintrag sind die beiden von core-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:

    1. Erstellen Sie eine local.prop-Datei mit folgendem Inhalt:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. 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.

  1. Richten Sie das Gerät ein.

    1. Konfigurieren Sie das Gerät wie unter Geräte konfigurieren beschrieben.

    2. 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
    3. Führen Sie die CUJs auf dem Gerät aus.

  2. Erfassen Sie das Profil mit dem folgenden Befehl:

    adb shell cmd package snapshot-profile android
  3. Extrahieren Sie das Profil mit dem folgenden Befehl:

    adb pull /data/misc/profman/android.prof
  4. Rufen Sie die JAR-Dateien des Boot-Klassenpfads mit den folgenden Befehlen auf:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. 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=...
  6. 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.