Есть ли hot restart и hot reload на нативе
Что проверяют
Понимаете ли вы, как устроены hot reload и hot restart, и почему то, что привычно во Flutter или в веб-разработке, на нативных iOS и Android работает иначе. Следом могут спросить, какие изменения hot reload не подхватывает.
Как отвечать
Сначала разведите термины на примере Flutter, откуда они пришли:
- hot reload: изменённый код подгружается в работающую Dart VM, дерево виджетов перестраивается, состояние сохраняется. Работает только в debug-сборке, где код исполняется JIT-компилятором;
- hot restart: код Dart перезапускается с нуля, состояние сбрасывается, но нативная часть не пересобирается, поэтому это быстрее полного перезапуска;
- полный перезапуск: нужен при изменениях в нативном коде, плагинах,
Info.plistилиAndroidManifest.xml.
Теперь натив. Swift и Kotlin компилируются заранее, и штатного hot reload в том же смысле нет, есть частичные замены:
- Android: Apply Changes в Android Studio подменяет тела методов без перезапуска, а при структурных изменениях требует перезапустить Activity или переустановить приложение. Для Jetpack Compose есть Live Edit, который обновляет composable-функции прямо на устройстве;
- iOS: Xcode Previews рисуют SwiftUI-вью в отдельном превью, но это не работающее приложение со своим состоянием. Горячую подмену кода дают сторонние инструменты вроде InjectionIII, в основном в симуляторе.
Для фронтенда полезно провести параллель с вебом. Там аналог это HMR в Vite или webpack, а React Fast Refresh (он же работает в React Native) сохраняет состояние хуков при правке компонента. Если модуль нельзя обновить безопасно, он откатывается к полной перезагрузке; типичный случай в Vite: файл экспортирует рядом с компонентом ещё и константы.
Где спотыкаются
Говорят, что Flutter поддерживает hot reload «везде». В release-сборке код скомпилирован AOT, горячей подмены там нет.
Ждут, что hot reload применит правку в initState или в инициализаторе глобальной переменной. Эти места не перевыполняются, нужен hot restart.
Путают Xcode Previews с hot reload приложения или HMR с live reload, при котором страница просто перезагружается целиком и состояние теряется.