ART-Just-in-Time-Compiler implementieren

Die Android-Laufzeit (ART) enthält einen Just-in-Time-Compiler (JIT) mit Codeprofilerstellung die die Leistung von Android-Apps kontinuierlich verbessert. Der JIT-Compiler ergänzt den aktuellen AOT-Compiler (AOT) von ART und verbessert die Laufzeitleistung, spart Speicherplatz und beschleunigt die Systemupdates. Er verbessert auch den AOT-Compiler, indem er Verlangsamung bei automatischen Anwendungsupdates oder Neukompilierungen von Anwendungen während Over-the-Air-Updates.

Obwohl JIT und AOT denselben Compiler mit einem ähnlichen Satz von Optimierungen verwenden, ist der generierte Code möglicherweise nicht identisch. JIT nutzt den Laufzeittyp Informationen erhalten, das Inline-Format verbessern und den Stack-Ersatz (OSR) ermöglichen Kompilierung möglich, bei der aller etwas unterschiedlichen Code generiert wird.

JIT-Architektur

JIT-Architektur
Abbildung 1: JIT-Architektur.

JIT-Kompilierung

Die JIT-Kompilierung umfasst die folgenden Aktivitäten:

Profilgestütztes Unternehmen
Abbildung 2: Profilgestützte Kompilierung
  1. Der Nutzer führt die App aus und löst dann ART aus, um das .dex zu laden. -Datei.
    • Wenn die Datei .oat (die AOT-Binärdatei für das .dex- Datei) verfügbar ist, verwendet ART sie direkt. Obwohl .oat-Dateien regelmäßig generiert werden, enthalten sie nicht immer kompilierten Code (AOT-Binärprogramm).
    • Wenn die Datei .oat keinen kompilierten Code enthält, wird ART ausgeführt. und den Interpreter, um die Datei .dex auszuführen.
  2. JIT ist für jede Anwendung aktiviert, die nicht gemäß den Kompilierungsfilter „speed“ (mit dem Text „Kompiliere so viel wie möglich“ aus der App“).
  3. Die JIT-Profildaten werden in eine Datei in einem Systemverzeichnis abgelegt, auf die die Anwendung zugreifen kann.
  4. Der Daemon der AOT-Kompilierung (dex2oat) parst diese Datei auf dem Laufwerk für die Kompilierung.

    JIT-Daemon
    Abbildung 3: JIT-Daemon-Aktivitäten.

Der Google Play-Dienst ist ein Beispiel für andere Apps, die sich ähnlich wie gemeinsam genutzte Bibliotheken.

JIT-Workflow

JIT-Architektur
Abbildung 4: JIT-Datenfluss.
  • Profilinformationen werden im Code-Cache gespeichert und automatisch bereinigt unter Speicherauslastung besorgt sind.
    • Es gibt keine Garantie dafür, dass ein Snapshot aufgenommen wurde, als sich die Anwendung im Hintergrund vollständige Daten enthält, d.h. alles, was JIT-Tests waren.
    • Es wird nicht versucht sicherzustellen, dass alles aufgezeichnet wird (dies kann Auswirkungen auf Laufzeitleistung).
  • Methoden können drei verschiedene Status haben: <ph type="x-smartling-placeholder">
      </ph>
    • interpretiert (Dex-Code)
    • JIT kompiliert
    • AOT kompiliert
    Wenn sowohl JIT- als auch AOT-Code vorhanden sind (z.B. aufgrund wiederholter Deoptimierungen), wird der JIT-Code bevorzugt.
  • Der Arbeitsspeicherbedarf zum Ausführen von JIT, ohne Auswirkungen auf die App im Vordergrund zu haben hängt von der jeweiligen App ab. Große Apps erfordern mehr Arbeitsspeicher als kleine Apps. Große Apps stabilisieren sich im Allgemeinen etwa 4 MB.

JIT-Protokollierung aktivieren

Führen Sie die folgenden Befehle aus, um die JIT-Protokollierung zu aktivieren:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

JIT deaktivieren

Führen Sie die folgenden Befehle aus, um JIT zu deaktivieren:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

Kompilierung erzwingen

Führen Sie folgenden Befehl aus, um die Kompilierung zu erzwingen:

adb shell cmd package compile

Häufige Anwendungsfälle für das Erzwingen der Kompilierung eines bestimmten Pakets:

  • Profilbasiert:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • Vollständig:
    adb shell cmd package compile -m speed -f my-package
    

Gängige Anwendungsfälle für das Erzwingen der Kompilierung aller Pakete:

  • Profilbasiert:
    adb shell cmd package compile -m speed-profile -f -a
    
  • Vollständig:
    adb shell cmd package compile -m speed -f -a
    

Profildaten löschen

Android 13 oder niedriger

Führen Sie folgenden Befehl aus, um lokale Profildaten zu löschen und kompilierten Code zu entfernen:

adb shell pm compile --reset 

Android 14 oder höher

So löschen Sie nur lokale Profildaten:

adb shell pm art clear-app-profiles 

Hinweis: Anders als beim Befehl für Android 13 oder früher verwendet, löscht dieser Befehl keine externen Profildaten (.dm), die die mit der App installiert wurden.

Zum Löschen lokaler Profildaten und Entfernen von kompiliertem Code, der aus lokalen Profilen generiert wurde (d.h. zum Zurücksetzen auf den Installationsstatus) führen Sie folgenden Befehl aus:

adb shell pm compile --reset 

Hinweis: Mit diesem Befehl wird kein kompilierter Code entfernt, der aus externe Profildaten („.dm“), die mit der App installiert werden.

Führen Sie den folgenden Befehl aus, um den gesamten kompilierten Code zu löschen:

adb shell cmd package compile -m verify -f 

Hinweis: Durch diesen Befehl werden lokale Profildaten beibehalten.