Boot-Image-Profile

Android 11 oder höher unterstützt das Generieren von Boot-Image-Profilen, die Informationen über den Code verschiedener Komponenten auf Systemebene wie Systemserver und Boot-Klassenpfad kapseln. Android Runtime (ART) verwendet diese Informationen, um systemweite Optimierungen durchzuführen, von denen einige für die Leistung von Android von entscheidender Bedeutung sind und sich auf die Ausführung des gesamten nicht-nativen Codes (System- oder App-Ebene) auswirken. In einigen Fällen können Boot-Image-Profile die Ausführungsleistung und den Speicherverbrauch im zweistelligen Prozentbereich beeinträchtigen.

Informationen zum Startprofil abrufen

Boot-Image-Profile werden aus den Profilen von Apps abgeleitet, die während Critical User Journeys (CUJs) ausgeführt werden. In einer bestimmten Gerätekonfiguration erfasst ART (als Teil der JIT-Profile) die von Apps verwendeten Boot-Klassenpfadmethoden und -klassen und zeichnet diese Informationen dann im App-Profil auf (z. B. /data/misc/profiles/cur/0/com.android.chrome/primary.prof ), wo es durch die Boot-Klassenpfad-Datei Dalvik EXecutable (DEX) indiziert wird (siehe ART-Profilformat ).

Überprüfen Sie die während CUJs aufgezeichneten App-Profile, um festzustellen, welcher Teil des Boot-Klassenpfads am häufigsten verwendet wird und am wichtigsten optimiert werden muss (ein Beispiel finden Sie unter ART-Profilformat ). Das Einbeziehen aller Methoden oder Klassen wirkt sich 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. Jedes Gerät sollte die Methoden-/Klassenauswahl basierend auf der CUJ-Auswahl und der durch Tests erzeugten Datenmenge konfigurieren.

Um Boot-Klassenpfadinformationen aus allen einzelnen App-Profilen auf dem Gerät zu aggregieren, 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 Methoden-/Klassenauswahl verwenden, ohne einzelne Profile manuell zu aggregieren (obwohl Sie dies bei Bedarf auch tun können).

Boot-Image-Profil

Abbildung 1. Prozess zum Abrufen von Boot-Image-Profilen

Boot-Image-Profildaten

Boot-Image-Profile umfassen 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, welche Klasse im Boot .art Image enthalten ist und wie die entsprechenden DEX-Dateien angeordnet sind.

  • Liste der vorinstallierten Klassen . Bestimmt, welche Klassen in Zygote vorinstalliert sind.

  • Profil für die Systemserverkomponenten ( frameworks/base/services/art-profile ). Bestimmt, 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 optimierungswürdigen Methoden und während des Starts verwendeten Klassen. Wenn die Boot-Image-Profilerstellung aktiviert ist, schließt ART auch den Boot-Klassenpfad und die JAR-Dateien des Systemservers in das Profil ein und versieht jede DEX-Datei mit dem Namen des Pakets, das sie verwendet.

Erstellen Sie beispielsweise einen Dump des Raw-Boot-Image-Profils mit dem folgenden Befehl:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

Dies erzeugt eine Ausgabe ähnlich der folgenden:

=== 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. Jeder Eintrag listet die beiden von core-oj.jar verwendeten Pakete auf.

  • Beide Prozesse verwenden die Methode mit dem DEX-Index 520, aber nur der systemui Prozess verwendet die Methode mit dem DEX-Index 521. Das gleiche Grundprinzip gilt für die anderen Profilabschnitte (z. B. die Startklassen).

Filtern Sie während der Datenverarbeitung Methoden/Klassen basierend auf der Verwendung und geben Sie Prozessen auf Systemebene (z. B. dem Systemserver oder systemui ) oder Methoden, die möglicherweise nicht häufig verwendet werden, aber dennoch wichtig sind (z. B. Methoden, die von verwendet werden) Priorität Kamera-App).

Das Profilformat kommentiert intern jede Methode mit mehreren Flags (Startup, Post-Startup, Hotness, ABI), was mehr ist, als im Nur-Dump-Format angezeigt wird. Um alle Signale zu nutzen, ändern Sie die verfügbaren Skripte.

Empfehlungen

Befolgen 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 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 jedoch nur mit derselben Version des Boot-Images (gleicher Boot-Klassenpfad).

  • Geben Sie den Methoden/Klassen, die von Systemprozessen verwendet werden, Auswahlpriorität. Diese Methoden/Klassen verwenden möglicherweise Code, der von anderen Apps nicht oft verwendet wird, dessen Optimierung aber dennoch wichtig ist.

  • Die Datenform eines einzelnen Gerätelaufs sieht ganz anders aus als bei Testgeräten, die reale CUJs ausführen. Wenn Sie nicht über eine große Flotte von Testgeräten verfügen, verwenden Sie dasselbe Gerät zum Ausführen mehrerer CUJs, um die Sicherheit zu erhöhen, dass die Optimierungen des Boot-Image-Profils in der Produktion gut funktionieren (dieses Szenario wird unten beschrieben).

Geräte konfigurieren

Um die Konfiguration des Startprofils über die Systemeigenschaften zu aktivieren, verwenden Sie eine der folgenden Methoden.

  • Option 1: Requisiten 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 eine local.prop (permanente Wirkung, bis die Datei gelöscht wird). Gehen Sie dazu wie folgt vor:

    1. Erstellen Sie eine local.prop Datei mit dem Inhalt:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Führen Sie die folgenden Befehle aus:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • Option 3: Verwenden Sie die Gerätekonfiguration, um die folgenden serverseitigen Eigenschaften festzulegen:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

Generieren Sie Boot-Image-Profile

Befolgen Sie die folgenden Anweisungen, um mithilfe von Tests auf einem einzelnen Gerät ein grundlegendes Boot-Image-Profil zu erstellen.

  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 das neue Profilformat die anderen Profile bereinigt und ersetzt. Um die Profilerfassung zu beschleunigen, 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. Navigieren Sie mit den folgenden Befehlen zu den Boot-Klassenpfad-JAR-Dateien:

    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 mithilfe der verfügbaren Auswahlschwellenwert-Flags.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    Die vollständige Liste finden Sie auf der profman Hilfeseite oder im Quellcode.