Ś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
kompilacja JIT
Kompilacja JIT obejmuje te działania:
- 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
.
- Jeśli plik
- 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”). - Dane profilu JIT są zapisywane do pliku w katalogu systemowym, do której aplikacja ma dostęp.
- Demon kompilujący AOT (
dex2oat
) analizuje ten plik na dysku kompilację danych.
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
- 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
- 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.