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

Как работает компиляция Flutter: AOT vs JIT?

2.0 Middle🔥 132 комментариев
#Компиляция

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

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

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

Компиляция Flutter: AOT vs JIT

AOT (Ahead-of-Time) и JIT (Just-in-Time) — это два разных способа компиляции Dart кода в Flutter. Выбор между ними зависит от режима разработки и режима запуска приложения.

JIT (Just-in-Time) компиляция

JIT компилирует код во время выполнения. Код сначала интерпретируется, а затем компилируется на лету.

Как работает JIT:

1. Исходный код (Dart) запускается
2. VM прочитывает и интерпретирует код
3. Часто исполняемые части компилируются в машинный код
4. Код оптимизируется на основе runtime информации
5. Приложение выполняется

Особенности JIT:

  • Медленный старт — первое запускание медленнее
  • Быстрая оптимизация — код оптимизируется во время работы
  • Hot Reload работает — можно инжектировать код динамически
  • Меньше памяти при компиляции
  • Используется в: Debug режиме, Development

Команды для JIT:

flutter run          # Debug режим (JIT по умолчанию)
flutter run --debug  # Явно указать Debug

AOT (Ahead-of-Time) компиляция

AOT компилирует весь код в машинный код ДО запуска приложения.

Как работает AOT:

1. Исходный код (Dart) анализируется полностью
2. Весь код компилируется в машинный код заранее
3. Создается оптимизированный бинарник
4. Приложение запускается из готового бинарника
5. Никакой компиляции во время работы

Особенности AOT:

  • Быстрый старт — приложение начинает работу сразу
  • Оптимальная производительность — код оптимизирован заранее
  • Hot Reload НЕ работает — код зафиксирован
  • Больше времени компиляции — изначально медленнее
  • Больше памяти для бинарника
  • Используется в: Release режиме, Production

Команды для AOT:

flutter run --release # Release режим (AOT)
flutter build apk     # Сборка для Android (AOT)
flutter build ios     # Сборка для iOS (AOT)

Сравнение

ПараметрJITAOT
Время компиляцииБыстроМедленно (1-5 мин)
Время запускаМедленный (~2 сек)Быстрый (~0.5 сек)
ПроизводительностьХорошаяОтличная
Hot ReloadРаботаетНе работает
Использование памятиСредняяВысокая
Размер appМеньшеБольше
ModeDebugRelease, Profile
VM neededДаНет

Процесс разработки

Debug (JIT) режим:

// Файл: lib/main.dart
void main() {
  print('App started (Debug JIT mode)');
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

// Команда
// flutter run

// Процесс:
// 1. Код начинает исполняться в Dart VM (интерпретация)
// 2. Hot Reload доступен (r в терминале)
// 3. Часто вызываемые функции компилируются в машинный код
// 4. Быстрая итерация разработки

Release (AOT) режим:

# Сборка для Release
flutter build apk --release

# Процесс:
# 1. AOT компилятор анализирует весь код
# 2. Создаёт машинный код для всех функций
# 3. Генерирует оптимизированный APK/IPA файл
# 4. Размер: ~20-50 MB
# 5. Быстрый старт и хорошая производительность

Практические примеры

Пример 1: Difference in execution

// Performance test

void main() async {
  final stopwatch = Stopwatch()..start();
  
  // Тяжелое вычисление
  int sum = 0;
  for (int i = 0; i < 1000000000; i++) {
    sum += i;
  }
  
  stopwatch.stop();
  print('Time: ${stopwatch.elapsedMilliseconds}ms');
  
  // Debug (JIT): ~5000ms
  // Release (AOT): ~500ms (в 10 раз быстрее!)
}

Пример 2: Hot Reload в Debug

# Работает ТОЛЬКО в Debug (JIT)
flutter run

# Измени цвет
class MyButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      style: ElevatedButton.styleFrom(
        backgroundColor: Colors.red, // Изменил
      ),
      child: Text('Click'),
      onPressed: () {},
    );
  }
}

# Сохрани (Ctrl+S) или нажми 'r' в терминале
# Результат: кнопка сразу стала красной (Hot Reload)

# В Release режиме это не работает:
flutter run --release
# Изменения не применятся без полной пересборки

Пример 3: Profile режим

# Profile режим: AOT + debug info
flutter run --profile

# Используется для:
# - Анализа производительности
# - Без оптимизации, как в Release
# - Но с информацией для profiling

Performance реальные числа

Startup time

Debug (JIT):     ~2000ms
Profile (AOT):   ~500ms
Release (AOT):   ~300ms

Execution speed

Debug (JIT):     1x (baseline)
Profile (AOT):   3-5x
Release (AOT):   5-10x

App size

Debug (JIT):     ~50 MB
Profile (AOT):   ~25 MB
Release (AOT):   ~20 MB

Когда использовать что

JIT (Debug)

  • Разработка и тестирование
  • Использование Hot Reload
  • Быстрая итерация
  • Debugging приложения

AOT (Release)

  • Production сборка
  • Финальное тестирование
  • Распределение пользователям
  • Максимальная производительность

AOT (Profile)

  • Performance profiling
  • Анализ узких мест
  • Optimization
  • Testing на близких к production условиях

Инструменты для анализа

# Analyse app performance
flutter run --profile
# Затем используй DevTools для profiling

# Посмотри CPU, Memory, FPS
flutter pub global activate devtools
devtools

Вывод

JIT используется для РАЗРАБОТКИ (быстрая итерация, Hot Reload), AOT используется для PRODUCTION (максимальная производительность и быстрый старт). Вот почему флаттер сначала компилирует в JIT при разработке, а потом в AOT для Release.