Разница между dexopt и dex2oat?
Google
движется от Dalvik
в ART
Android Runtime.
Я пытался понять, как это собирается улучшить производительность.
Лучшее объяснение, которое я нашел, это изображение ниже:
Один из основных компонентов, который изменился dexopt
в dex2oat
,
Поскольку я не очень разбираюсь в этом, может кто-нибудь объяснить разницу и как это улучшит производительность?
2 ответа
dexopt выполняет некоторые оптимизации в файле dex. Он выполняет такие вещи, как замена инструкции виртуального вызова на оптимизированную версию, которая включает в себя индекс vtable вызываемого метода, чтобы не выполнять поиск метода во время выполнения.
Результатом dexopt является файл odex (оптимизированный dex). Это очень похоже на исходный файл dex, за исключением того, что он использует некоторые оптимизированные коды операций, например, виртуальную инструкцию оптимизированного вызова.
dex2oat берет файл dex и компилирует его. В результате получается эльфийский файл, который затем выполняется изначально. Таким образом, вместо того, чтобы иметь байт-код, который интерпретируется виртуальной машиной, теперь он имеет собственный код, который может быть выполнен непосредственно процессором. Это называется AOT (опережающая) компиляция.
Оба инструмента обычно запускаются во время установки на устройстве.
Еще один фактор, который следует учитывать, - это то, что dalvik использовал JIT-компилятор (точно по времени) - это означает, что он также мог компилировать байт-код в нативный код. Основное отличие состоит в том, что ART компилирует все заранее, в то время как dalvik компилирует только подмножество байт-кода, используя эвристику для обнаружения кода, который выполнялся наиболее часто, и компилируется во время выполнения.
Android Runtime (ART) - это среда выполнения приложений, используемая мобильной операционной системой Android. ART заменяет Dalvik, который является виртуальной машиной процесса, изначально используемой Android, и выполняет преобразование байт-кода приложения в собственные инструкции, которые впоследствии выполняются средой выполнения устройства.
В отличие от Dalvik, который начиная с Android 2.2 "Froyo" использует компиляцию "точно в срок" (JIT) для компиляции байт-кода при каждом запуске приложения, ART вводит использование опережающей (AOT) компиляции, выполняя ее после установки приложения. За счет уменьшения общего объема компиляции, которая должна выполняться во время работы приложения, уменьшается использование процессора мобильным устройством и улучшается время работы от батареи. В то же время ART обеспечивает повышение производительности, сборку мусора, отладку приложений и профилирование.
Для обеспечения обратной совместимости ART использует тот же входной байт-код, что и Dalvik, предоставляемый через стандарт .dex
файлы как часть файлов APK, а .odex
файлы заменяются исполняемыми файлами и исполняемыми файлами (ELF). После того, как приложение скомпилировано с помощью утилиты ART dex2oat на устройстве, оно запускается исключительно из скомпилированного исполняемого файла ELF; этот подход устраняет различные накладные расходы, связанные с JIT-компиляцией, но требует дополнительного времени для компиляции, когда приложение установлено, и приложения занимают немного больше места для хранения скомпилированного кода.