Wdrażanie kompilatora ART just-in-time

Środowisko wykonawcze Androida (ART) zawiera kompilator „just-in-time” (JIT) z profilowaniem kodu, który stale poprawia wydajność uruchomionych aplikacji na Androida. Kompilator JIT uzupełnia obecny kompilator AOT w ART i poprawia wydajność w czasie działania, oszczędza miejsce na dane oraz przyspiesza aktualizacje aplikacji i systemu. Poprawia też działanie kompilatora AOT, zapobiegając spowalnianiu systemu podczas automatycznych aktualizacji aplikacji lub ponownej kompilacji aplikacji w trakcie aktualizacji bezprzewodowych (OTA).

Chociaż kompilacja JIT i AOT korzysta z tego samego kompilatora z podobnym zestawem optymalizacji, wygenerowany kod może się różnić. JIT wykorzystuje informacje o typie środowiska wykonawczego, lepiej wbudowuje treści i umożliwia kompilację systemu wymiany stosu (OSR), która generuje nieco inny kod.

Architektura JIT

Architektura JIT
Rysunek 1. Architektura JIT.

Kompilacja JIT

Kompilacja JIT obejmuje te działania:

Kompozyt z uwzględnieniem profilu
Rysunek 2. kompilacja kierowana przez profil
.
  1. Użytkownik uruchamia aplikację, która powoduje, że ART wczytuje plik .dex.
    • Jeśli plik .oat (binarny plik AOT dla pliku .dex) jest dostępny, ART używa go bezpośrednio. Chociaż pliki .oat są generowane regularnie, nie zawsze zawierają skompilowany kod (binarny AOT).
    • Jeśli plik .oat nie zawiera skompilowanego kodu, ART uruchamia go za pomocą JIT i tłumaczacza..dex
  2. Metoda JIT jest włączona dla każdej aplikacji, która nie jest skompilowana zgodnie z filtrem kompilacji speed (który mówi „skompiluj jak najwięcej z aplikacji”).
  3. Dane profilu JIT są zapisywane do pliku w katalogu systemowym, do którego ma dostęp tylko aplikacja.
  4. Demon kompilacji AOT (dex2oat) analizuje ten plik, aby przeprowadzić jego kompilację.

    Demon JIT
    Rysunek 3. działania demona JIT.

Usługa Google Play jest przykładem usługi używanej przez inne aplikacje, które działają podobnie do udostępnionych bibliotek.

Przepływ pracy JIT

Architektura JIT
Rysunek 4. Przepływ danych JIT.
  • Informacje do profilowania są przechowywane w pamięci podręcznej kodu i podlegają zbieraniu elementów zbędnych, gdy brakuje pamięci.
    • Nie ma gwarancji, że zrzut wykonany, gdy aplikacja była w tle, będzie zawierać pełne dane (czyli wszystko, co zostało zoptymalizowane na potrzeby JIT).
    • Nie ma próby zapewnienia, że wszystko zostanie nagrane (ponieważ może to wpłynąć na wydajność w czasie działania).
  • Metody mogą mieć 3 różne stany:
    • interpreted (kod Dex)
    • Kompilacja JIT
    • Kompilacja AOT
    Jeśli istnieje kod JIT i AOT (np. z powodu wielokrotnego odoptymalizowania), preferowany jest kod JIT.
  • Wymóg pamięci potrzebny do uruchomienia JIT bez wpływu na wydajność aplikacji na pierwszym planie zależy od danej aplikacji. Duże aplikacje wymagają więcej pamięci niż małe aplikacje. Ogólnie duże aplikacje osiągają stabilny rozmiar około 4 MB.

Włącz logowanie JIT

Aby włączyć rejestrowanie JIT, uruchom te polecenia:

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

Wyłączanie kompilacji JIT

Aby wyłączyć JIT, uruchom te polecenia:

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

Wymuś kompilację

Aby wymusić kompilację, wykonaj te czynności:

adb shell cmd package compile

Typowe przypadki stosowania wymuszonej kompilacji konkretnego pakietu:

  • Na podstawie profilu:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • Pełne:
    adb shell cmd package compile -m speed -f my-package
    

Typowe przypadki korzystania z wymuszania kompilacji wszystkich pakietów:

  • Na podstawie profilu:
    adb shell cmd package compile -m speed-profile -f -a
    
  • Pełne:
    adb shell cmd package compile -m speed -f -a
    

Wyczyszczenie danych z profilu

Android 13 lub starszy

Aby wyczyścić lokalne dane profilu i usunąć skompilowany kod, wykonaj te czynności:

adb shell pm compile --reset 

Na urządzeniu z Androidem 14 lub nowszym

Aby wyczyścić tylko dane profilu lokalnego:

adb shell pm art clear-app-profiles 

Uwaga: w przeciwieństwie do polecenia w Androidzie 13 i starszych wersjach to polecenie nie usuwa zewnętrznych danych profilu (`.dm`) zainstalowanych w aplikacji.

Aby wyczyścić dane profilu lokalnego i usunąć skompilowany kod wygenerowany z danych profilu lokalnego (tj. przywrócić stan instalacji), uruchom to polecenie:

adb shell pm compile --reset 

Uwaga: to polecenie nie usuwa skompilowanego kodu wygenerowanego z danych zewnętrznego profilu (plika „.dm”), który został zainstalowany wraz z aplikacją.

Aby wyczyścić cały skompilowany kod, uruchom to polecenie:

adb shell cmd package compile -m verify -f 

Uwaga: to polecenie zachowuje dane profilu lokalnego.