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. 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.

Boot-Image-Profil

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 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 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:

    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: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.

  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. Gehen Sie mit den folgenden Befehlen zu den JAR-Dateien des Boot-Klassenpfads:

    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. 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.