Ś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
Kompilacja JIT
Kompilacja JIT obejmuje te działania:
- 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
- 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”). - Dane profilu JIT są zapisywane do pliku w katalogu systemowym, do którego ma dostęp 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.
Przepływ pracy 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
- 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.