Wdrażanie kompilatora ART just-in-time

Środowisko wykonawcze Androida (ART) zawiera kompilator „just-in-time” (JIT) z profilowaniem kodu który stale zwiększa wydajność działających aplikacji na Androida. Kompilator JIT uzupełnia aktualny kompilator ART (AOT) używany przed czasem i poprawia wydajność środowiska wykonawczego, oszczędza miejsce na dane i przyspiesza działanie aplikacji oraz aktualizacji systemu. Poprawia też działanie kompilatora AOT, unikając systemu spowolnienie działania podczas automatycznych aktualizacji lub ponownej kompilacji aplikacji. podczas aktualizacji OTA.

Chociaż JIT i AOT korzystają z tego samego kompilatora z podobnym zestawem optymalizacji, wygenerowany kod może być inny. JIT korzysta z typu środowiska wykonawczego informacji, lepiej wbudować w treści i ułatwia wymianę stosu (OSR) kompilację, która generuje nieco inny kod.

Architektura JIT

Architektura JIT
Rysunek 1. z architekturą JIT.

kompilacja JIT

Kompilacja JIT obejmuje te działania:

Konkurs prowadzony przez profil
Rysunek 2. Kompilacja prowadzona przez profil.
  1. Użytkownik uruchamia aplikację, co powoduje, że ART wczytuje .dex .
    • Jeśli plik .oat (plik binarny AOT dla instancji .dex ) jest dostępny, a ART korzysta z niego bezpośrednio. Mimo że .oat pliki są generowane regularnie, nie zawsze zawierają skompilowany kod (binarny AOT).
    • Jeśli plik .oat nie zawiera skompilowanego kodu, ART uruchamia się za pomocą JIT i interpretatora do wykonania pliku .dex.
  2. JIT jest włączony dla każdej aplikacji, która nie jest skompilowana zgodnie z Filtr kompilacji speed (z tekstem „skompiluj jak najwięcej) z aplikacji”).
  3. Dane profilu JIT są zapisywane do pliku w katalogu systemowym, do której aplikacja ma dostęp.
  4. Demon kompilujący AOT (dex2oat) analizuje ten plik na dysku kompilację danych.

    demon JIT
    Rysunek 3. działania demonów JIT.

Przykładem użycia usługi Google Play przez inne aplikacje, które zachowują się podobnie jak w bibliotekach udostępnionych.

Przepływ pracy JIT

Architektura JIT
Rysunek 4. Przepływ danych JIT
  • Informacje o profilowaniu są przechowywane w pamięci podręcznej kodu i poddawane czyszczenia podczas zbierania danych.
    • Nie ma gwarancji, że zrzut utworzony, gdy aplikacja znajdowała się w tło będzie zawierać pełne dane (tj. wszystko, co zajęto JIT).
    • Nie próbujemy zagwarantować, że wszystko jest zarejestrowane (ponieważ może to mieć wpływ wydajność środowiska wykonawczego).
  • Metody mogą mieć 3 różne stany:
    • interpreted (kod Dex)
    • Skompilowano JIT
    • Skompilowano AOT
    . Jeśli istnieje zarówno kod JIT, jak i AOT (np. z powodu wielokrotnych deoptymalizacji), Preferowany jest kod JITed.
  • Wymóg pamięci potrzebny do uruchomienia JIT bez wpływu na aplikację na pierwszym planie zależy od danej aplikacji. Duże aplikacje wymagają więcej pamięci niż w przypadku małych aplikacji. Ogólnie duże aplikacje stabilizują się około 4 MB.

Włącz logowanie JIT

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

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

Wyłącz 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ę, uruchom to polecenie:

adb shell cmd package compile

Typowe przypadki użycia wymuszania kompilowania konkretnego pakietu:

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

Typowe przypadki użycia wymuszania kompilowania wszystkich pakietów:

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

Wyczyść dane profilu

Android 13 lub starszy

Aby wyczyścić dane profilu lokalnego i skompilowany kod, uruchom to polecenie:

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 odróżnieniu od polecenia w Androidzie 13 lub wcześniej, to polecenie nie usuwa zewnętrznych danych profilu (`.dm`), które są zainstalowane wraz z aplikacją.

Aby wyczyścić dane profilu lokalnego i usunąć skompilowany kod wygenerowany na komputerze lokalnym (tj. aby zresetować do stanu instalacji), uruchom to polecenie:

adb shell pm compile --reset 

Uwaga: to polecenie nie usuwa skompilowanego kodu wygenerowanego w zewnętrzne dane profilu (`.dm`) zainstalowane wraz z aplikacją.

Aby usunąć cały skompilowany kod, uruchom to polecenie:

adb shell cmd package compile -m verify -f 

Uwaga: to polecenie umożliwia zachowanie danych profilu lokalnego.