Компилятор Android, архитектура и время выполнения, как это работает вместе?
В последнее время я изучаю среду выполнения Android, уделяя особое внимание инструменту dex2oat, который является сердцем. Однако dex2oat не изолирован, но работает вместе с загрузочным образом Android, android-root, набором команд, runtime-arg и т. Д.
Может кто-нибудь объяснить, что они и для чего они используются? А их внутренние связи?
1 ответ
Итак, dex2oat входит в состав нового Android Runtime (ART). Идея состоит в том, чтобы заменить интерпретатор байт-кода Android (и JIT-компилятор) более ранним компилятором и обеспечить новую среду выполнения, которая может загружать и выполнять скомпилированные приложения.
dex2oat
Утилита dex2oat - это полный пакет компиляции, который предоставляет множество опций компиляции, несколько компиляторов и бэкендов для генерации кода для каждой процессорной платформы, на которой в настоящее время работает Android. Так что, если кто-то ссылается на dex2oat, подразумевается компилятор Android AOT (suite). Его входной формат - байт-код dex, и он выводит так называемые oat-файлы, которые являются общими объектами ELF. Преимущество компиляции AOT по сравнению с интерпретацией (или JIT-компиляцией) состоит в том, что мы не замедляем время выполнения, если применяем более сложные оптимизации, как это происходит ДО приложения. Кроме того, поскольку мы говорим о компиляторе на устройстве, приложения все еще могут поставляться как байт-код dex, но скомпилированы на устройстве для его конкретной архитектуры. Насколько мне известно, на данный момент есть бэкэнды для ARM, MIPS и x86 для 32 и 64 бит каждый.
Загрузочный образ
До внедрения ART Android использовал Zygote для разветвления каждого процесса приложения, а также для предварительной загрузки и предварительной инициализации некоторых классов в целях оптимизации. В ART набор библиотек jar, которые должны быть предварительно загружены в каждый процесс приложения, один раз компилируется в так называемый загрузочный образ. Он состоит из двух файлов, boot.oat и boot.art. Boot.oat содержит скомпилированный код, в то время как boot.art содержит предварительно инициализированную кучу и т. Д. Оба также генерируются dex2oat. Этот загрузочный образ загружается в процесс каждого приложения в качестве оптимизации.
Среда выполнения
Поскольку приложения теперь представляют собой скомпилированные файлы oat, ART предоставляет новую среду выполнения для их загрузки и выполнения. Таким образом, идея состоит в том, чтобы загрузить общий объект ELF в предварительно инициализированный процесс приложения и выполнить приложение. Поскольку код уже скомпилирован, нет необходимости интерпретировать во время выполнения. Некоторыми исключениями являются системы, работающие на небольшом постоянном хранилище (большие файлы), отлаженные приложения и т. Д. В этих случаях ART может прибегнуть к интерпретации. Но в целом компиляция приложений AOT - это новый стандарт по умолчанию.