Środowisko uruchomieniowe Androida (ART) zawiera kompilator just-in-time (JIT) z profilowaniem kodu, który stale zwiększa wydajność aplikacji na Androida podczas ich działania. 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. Jest też lepszy od kompilatora AOT, ponieważ zapobiega spowolnieniu systemu podczas automatycznych aktualizacji aplikacji lub ich ponownej kompilacji podczas aktualizacji bezprzewodowych (OTA).
Chociaż kompilacja JIT i AOT korzysta z tego samego kompilatora z podobnym zestawem optymalizacji, wygenerowany kod może się różnić. Kompilacja JIT korzysta z informacji o typach w czasie wykonywania, może lepiej wstawiać kod inline i umożliwia kompilację z zastępowaniem na stosie (OSR). Wszystkie te funkcje generują nieco inny kod.
Architektura JIT

Kompilacja JIT
Kompilacja JIT obejmuje te czynności:

- 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
- Jeśli plik
- Kompilacja JIT jest włączona w przypadku każdej aplikacji, która nie jest kompilowana zgodnie z filtrem kompilacji
speed
(który mówi „skompiluj jak najwięcej z aplikacji”). - Dane profilu JIT są zapisywane w pliku w katalogu systemowym, do którego dostęp ma tylko aplikacja.
- Demon kompilacji AOT (
dex2oat
) analizuje ten plik, aby przeprowadzić jego kompilację.
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.
Proces 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 uruchomiona 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 stany:
- interpretowany (kod dex)
- Kompilacja JIT
- Kompilacja AOT
- Wymagania dotyczące pamięci, aby JIT działał bez wpływu na wydajność aplikacji na pierwszym planie, zależą 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łączanie logowania 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 stosowania wymuszonej 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
Na Androidzie 13 lub starszym
Aby wyczyścić lokalne dane profilu i usunąć skompilowany kod, wykonaj te czynności:
adb shell pm compile --reset
Na Androidzie 14 lub nowszym
Aby wyczyścić tylko dane profilu lokalnego:
adb shell pm art clear-app-profiles
Uwaga: w odróżnieniu od polecenia w przypadku Androida 13 lub starszych wersji to polecenie nie usuwa danych profilu zewnętrznego („.dm”), które są instalowane wraz z aplikacją.
Aby wyczyścić dane lokalnego profilu i usunąć skompilowany kod wygenerowany na podstawie danych lokalnego profilu (czyli zresetować do stanu instalacji), wykonaj te czynności:
adb shell pm compile --reset
Uwaga: to polecenie nie usuwa skompilowanego kodu wygenerowanego z danych zewnętrznego profilu (plika „.dm”), który jest instalowany razem 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.