Среда выполнения Android (ART) включает в себя JIT-компилятор с профилированием кода, который постоянно повышает производительность приложений Android во время их работы. JIT-компилятор дополняет текущий компилятор опережающего времени (AOT) ART и повышает производительность во время выполнения, экономит место для хранения и ускоряет обновления приложений и системы. Он также улучшает работу компилятора AOT, позволяя избежать замедления работы системы во время автоматического обновления приложений или перекомпиляции приложений во время обновлений по беспроводной сети (OTA).
Хотя JIT и AOT используют один и тот же компилятор со схожим набором оптимизаций, сгенерированный код может не быть идентичным. JIT использует информацию о типах времени выполнения, может лучше выполнять встраивание и делает возможной компиляцию с заменой стека (OSR), и все это генерирует немного другой код.
JIT-архитектура
JIT-компиляция
JIT-компиляция включает в себя следующие действия:
- Пользователь запускает приложение, которое затем запускает ART для загрузки файла
.dex
.- If the
.oat
file (the AOT binary for the.dex
file) is available, ART uses it directly. Хотя файлы.oat
создаются регулярно, они не всегда содержат скомпилированный код (двоичный код AOT). - Если файл
.oat
не содержит скомпилированного кода, ART запускает JIT и интерпретатор для выполнения файла.dex
.
- If the
- JIT is enabled for any application that is not compiled according to the
speed
compilation filter (which says "compile as much as you can from the app"). - Данные профиля JIT сохраняются в файл в системном каталоге, к которому имеет доступ только приложение.
- The AOT compilation (
dex2oat
) daemon parses that file to drive its compilation.Рисунок 3. Действия демона JIT.
Сервис Google Play — это пример других приложений, которые ведут себя аналогично общим библиотекам.
Рабочий процесс JIT
- Информация о профилировании хранится в кэше кода и подвергается сборке мусора из-за нехватки памяти.
- Нет никакой гарантии, что снимок, сделанный, когда приложение работало в фоновом режиме, будет содержать полные данные (т. е. все, что было JIT-компилировано).
- Не делается никаких попыток обеспечить запись всего (поскольку это может повлиять на производительность во время выполнения).
- Методы могут находиться в трех разных состояниях:
- интерпретируется (код dex)
- JIT скомпилировано
- AOT скомпилирован
- Требование к памяти для запуска JIT без влияния на производительность приложения на переднем плане зависит от рассматриваемого приложения. Большие приложения требуют больше памяти, чем маленькие. Обычно большие приложения стабилизируются на уровне 4 МБ.
Включить ведение журнала JIT
Чтобы включить ведение журнала JIT, выполните следующие команды:
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
Отключить JIT
Чтобы отключить JIT, выполните следующие команды:
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
Принудительная компиляция
Чтобы принудительно компилировать, выполните следующее:
adb shell cmd package compile
Распространенные случаи использования принудительной компиляции определенного пакета:
- На основе профиля:
adb shell cmd package compile -m speed-profile -f my-package
- Полный:
adb shell cmd package compile -m speed -f my-package
Распространенные случаи использования принудительной компиляции всех пакетов:
- На основе профиля:
adb shell cmd package compile -m speed-profile -f -a
- Полный:
adb shell cmd package compile -m speed -f -a
Очистить данные профиля
На Android 13 или более ранней версии
Чтобы очистить данные локального профиля и удалить скомпилированный код, выполните следующую команду:
adb shell pm compile --reset
На Android 14 или более поздней версии
Чтобы очистить только данные локального профиля:
adb shell pm art clear-app-profiles
Примечание. В отличие от команды для Android 13 или более ранней версии, эта команда не удаляет данные внешнего профиля (.dm), установленные вместе с приложением.
Чтобы очистить данные локального профиля и удалить скомпилированный код, созданный на основе данных локального профиля (т. е. для возврата к состоянию установки), выполните следующую команду:
adb shell pm compile --reset
Примечание. Эта команда не удаляет скомпилированный код, созданный на основе данных внешнего профиля (`.dm`), установленных вместе с приложением.
Чтобы очистить весь скомпилированный код, выполните следующую команду:
adb shell cmd package compile -m verify -f
Примечание. Эта команда сохраняет данные локального профиля.
,Среда выполнения Android (ART) включает в себя JIT-компилятор с профилированием кода, который постоянно повышает производительность приложений Android во время их работы. JIT-компилятор дополняет текущий компилятор ART с опережением времени (AOT) и повышает производительность во время выполнения, экономит место для хранения и ускоряет обновления приложений и системы. Он также улучшает работу компилятора AOT, позволяя избежать замедления работы системы во время автоматического обновления приложений или перекомпиляции приложений во время обновлений по беспроводной сети (OTA).
Хотя JIT и AOT используют один и тот же компилятор со схожим набором оптимизаций, сгенерированный код может не быть идентичным. JIT использует информацию о типах времени выполнения, может лучше выполнять встраивание и делает возможной компиляцию с заменой стека (OSR), и все это генерирует немного другой код.
JIT-архитектура
JIT-компиляция
JIT-компиляция включает в себя следующие действия:
- Пользователь запускает приложение, которое затем запускает ART для загрузки файла
.dex
.- Если файл
.oat
(двоичный файл AOT для файла.dex
) доступен, ART использует его напрямую. Although.oat
files are generated regularly, they don't always contain compiled code (AOT binary). - If the
.oat
file does not contain compiled code, ART runs through JIT and the interpreter to execute the.dex
file.
- Если файл
- JIT is enabled for any application that is not compiled according to the
speed
compilation filter (which says "compile as much as you can from the app"). - Данные профиля JIT сохраняются в файл в системном каталоге, к которому имеет доступ только приложение.
- Демон компиляции AOT (
dex2oat
) анализирует этот файл для запуска его компиляции.Рисунок 3. Действия демона JIT.
Сервис Google Play — это пример других приложений, которые ведут себя аналогично общим библиотекам.
Рабочий процесс JIT
- Информация о профилировании хранится в кэше кода и подвергается сборке мусора из-за нехватки памяти.
- Нет никакой гарантии, что снимок, сделанный, когда приложение работало в фоновом режиме, будет содержать полные данные (т. е. все, что было JIT-компилировано).
- Не делается никаких попыток обеспечить запись всего (поскольку это может повлиять на производительность во время выполнения).
- Методы могут находиться в трех разных состояниях:
- интерпретируется (код dex)
- JIT скомпилировано
- AOT скомпилирован
- Требование к памяти для запуска JIT без влияния на производительность приложения на переднем плане зависит от рассматриваемого приложения. Большие приложения требуют больше памяти, чем маленькие. Обычно большие приложения стабилизируются на уровне 4 МБ.
Включить ведение журнала JIT
Чтобы включить ведение журнала JIT, выполните следующие команды:
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
Отключить JIT
Чтобы отключить JIT, выполните следующие команды:
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
Принудительная компиляция
Чтобы принудительно компилировать, выполните следующее:
adb shell cmd package compile
Распространенные случаи использования принудительной компиляции конкретного пакета:
- На основе профиля:
adb shell cmd package compile -m speed-profile -f my-package
- Полный:
adb shell cmd package compile -m speed -f my-package
Распространенные случаи использования принудительной компиляции всех пакетов:
- На основе профиля:
adb shell cmd package compile -m speed-profile -f -a
- Полный:
adb shell cmd package compile -m speed -f -a
Очистить данные профиля
На Android 13 или более ранней версии
Чтобы очистить данные локального профиля и удалить скомпилированный код, выполните следующую команду:
adb shell pm compile --reset
На Android 14 или более поздней версии
Чтобы очистить только данные локального профиля:
adb shell pm art clear-app-profiles
Примечание. В отличие от команды для Android 13 или более ранней версии, эта команда не удаляет данные внешнего профиля (.dm), установленные вместе с приложением.
Чтобы очистить данные локального профиля и удалить скомпилированный код, созданный на основе данных локального профиля (т. е. для возврата к состоянию установки), выполните следующую команду:
adb shell pm compile --reset
Примечание. Эта команда не удаляет скомпилированный код, созданный на основе данных внешнего профиля (.dm), установленного вместе с приложением.
Чтобы очистить весь скомпилированный код, выполните следующую команду:
adb shell cmd package compile -m verify -f
Примечание. Эта команда сохраняет данные локального профиля.