← Назад к вопросам

Какая компиляция используется в Android?

1.7 Middle🔥 111 комментариев
#JVM и память

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Компиляция в Android: Мультиэтапный процесс

В Android используется многступенчатая (мультиэтапная) компиляция, сочетающая несколько компиляторов и инструментов для преобразования исходного кода в исполняемый формат, оптимизированный для мобильных устройств. Это сложный процесс, который эволюционировал с переходом от Dalvik VM к Android Runtime (ART) и внедрением новых языков и инструментов.

Основные этапы компиляции

Процесс можно разделить на ключевые этапы:

  1. Компиляция исходного кода (Java/Kotlin) в bytecode JVM
    *   Код Java или Kotlin компилируется с помощью соответствующих компиляторов (`javac` для Java, `kotlinc` для Kotlin) в **Java bytecode** (.class файлы).
    *   Этот этап происходит на стороне разработчика (обычно управляется Gradle).

```java
// Пример исходного кода Java
public class MainActivity {
    public void onCreate() {
        System.out.println("Hello ART");
    }
}
// После компиляции javac -> MainActivity.class (Java bytecode)
```

2. Трансформация в DEX формат (Dalvik Executable)

    *   Инструмент **D8** (или ранее **DX**) преобразует набор .class файлов в один или несколько **.dex файлов**. Этот формат оптимизирован для эффективного исполнения на устройствах с ограниченными ресурсами.
    *   DEX формат использует общие пулы констант и более компактное представление инструкций.

  1. Упаковка в APK/AAB
    *   DEX файлы, ресурсы, манифест и библиотеки объединяются в архив **APK** (Android Package) или **AAB** (Android App Bundle).

  1. Установка и исполнение на устройстве: AOT vs JIT
    *   Это самый важный этап, различающийся между Dalvik и ART. В современной **ART** используется комбинация подходов:

    **AOT (Ahead-Of-Time) компиляция:**
    *   Происходит **до запуска** приложения, обычно во время его установки на устройство.
    *   ART компилирует DEX bytecode в машинный код (native code) для конкретного процессора устройства (armeabi-v7a, arm64-v8a, etc.).
    *   Результат сохраняется на диске, что обеспечивает быстрый запуск и высокую производительность исполнения.
```bash
# Упрощенная концепция: ART преобразует .dex в .oat (ELF файл)
dex_file -> compiled_oat_file (нативный код для CPU)
```
    **JIT (Just-In-Time) компиляция:**
    *   В ART также присутствует **JIT компилятор**, который работает во время **запуска и исполнения** приложения.
    *   Его задачи:
        *   Компиляция "горячих" методов (часто исполняемых), которые не были скомпилированы AOT, для оптимизации их дальнейшего выполнения.
        *   Сбор профилирующих данных (профилирование) о работе приложения, которые затем могут быть использованы для оптимизации следующей **AOT компиляции** (например, при обновлении приложения или системе фоновой компиляции).

Ключевые инструменты и компиляторы

  • D8/R8: Современные инструменты от Google для конвертации Java bytecode в DEX и выполнения оптимизаций (минификация, обфускация). R8 объединяет функции D8 и ProGuard.
  • ART Compiler: Встроенный в Android Runtime компилятор, выполняющий AOT и JIT трансформации. В современных версиях Android он использует технологию dex2oat.
  • NDK и компиляция C/C++: Для нативного кода используется Clang/LLVM через Android NDK (Native Development Kit). Здесь происходит классическая компиляция исходного C/C++ в нативные библиотеки (.so файлы).
    // native-lib.cpp
    #include <jni.h>
    extern "C" JNIEXPORT jstring Java_MainActivity_getMessage(JNIEnv* env) {
        return env->NewStringUTF("Native compiled with Clang");
    }
    // Компиляция через NDK -> libnative-lib.so (библиотека для ARM)
    

Эволюция и важные изменения

  • Android 5.0 (Lollipop): Переход от Dalvik (с исключительно JIT компиляцией) к ART (с первичным AOT). Это значительно повысило производительность.
  • Android 7.0 (Nougat): Введение Hybrid Runtime в ART: сочетание AOT, JIT и профилирования. JIT стал собирать профили для оптимизации будущей AOT компиляции.
  • Android 9.0 (Pie): Появление фоновой компиляции после установки. Система использует профиль, собранный JIT во время первых запусков, чтобы перекомпилировать критичные методы в фоне, улучшая баланс между скоростью установки и производительностью.

Таким образом, компиляция в Android — это не единичный процесс, а целый конвейер (pipeline), включающий компиляцию Java/Kotlin в bytecode, преобразование в DEX формат и финальную компиляцию в нативный код (или гибридное исполнение) на целевом устройстве с помощью ART. Этот подход позволяет достигать баланса между скоростью разработки (использование Java/Kotlin), размером приложения (оптимизированный DEX) и максимальной производительностью на разнообразном мобильном hardware (AOT/JIT компиляция в ART).

Какая компиляция используется в Android? | PrepBro