Разница между «Мгновенным бегом» Android и «Горячей перезагрузкой» Флаттера и Реактивной перезагрузкой «Родного»? - PullRequest
0 голосов
/ 28 августа 2018

В настоящее время я работаю над React Native Project, и когда я встряхиваю телефон после запуска проекта, он дает мне живые обновления. поскольку я также работал с Flutter, он также предоставляет мне тот же вид OutPut. но в Android есть функция Instant Run.

Я погуглил Мгновенный Бег. и некоторые результаты отличаются Мгновенный запуск не является горячей перезагрузкой для Android Studio.

Итак, я хочу знать, в чем значительная разница в работе и особенностях мгновенного запуска и горячей перезагрузки?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

На самом деле очень мало различий между тем, как работает Горячая перезагрузка Флаттера и Мгновенный запуск Android Studio .

Они оба проверяют наличие изменений кода, выполняют этап компиляции только для того, что изменилось, а затем отправляют его на телефон для запуска. Приложения Android и Flutter используют виртуальную машину (jvm или dart vm), которая способна изменять классы на лету.


Когда вы выполняете Flutter Hot Reload , он выполняет быстрый пошаговый этап компиляции, а затем отправляет ваш код дротика на телефон, где он запускается практически мгновенно. Это происходит так быстро, отчасти потому, что Flutter использует JIT-модель компиляции при работе в режиме отладки, что означает, что компиляция тратит меньше времени, но первый запуск (или первые несколько прогонов) метода может быть не оптимизирован. Состояние сохраняется между изменениями во многих случаях из-за того, как работает флаттер, а не из-за чего-то, свойственного JIT-обработке дротиком. А для некоторых вещей (на ум приходят статические функции и функции initState) вам действительно нужно выполнить Full Reload , который повторно инициализирует состояние приложения, но все еще почти мгновенно.


Что такое Android Studio для Instant Run очень похоже, но всегда полностью компилируется. ВМ имеет некоторые инструменты, поэтому при вызове метода ВМ проверяет, введен ли новый класс. Instant Run сделает все возможное, чтобы заменить как можно меньше; если он может просто заменить некоторые классы, которые он будет делать, но он часто должен заменить всю деятельность, а иногда и все приложение. Вот хорошая диаграмма из этого блога (которую стоит прочитать, если вы хотите глубже понять): Instant Run Workflow


Функционально, Мгновенный запуск и Горячая перезагрузка должны быть очень похожи. Однако на практике я обнаружил, что Hot Reload флаттера довольно намного быстрее, чем Instant Run , особенно для приложений любого размера.

Кроме того, я обнаружил, что то, как флаттер работает с состояниями, гораздо лучше подходит для пересчитанных классов, чем для действий Android. Во Flutter у вас есть много классов, связанных с пользовательским интерфейсом, каждый со своим собственным состоянием, и изменение только нескольких из них довольно быстро. В качестве альтернативы, в Android вы, как правило, имеете большие представления или пользовательский интерфейс действий, для замены которых требуется больше усилий, и часто это приводит к перезагрузке действий, а не просто класса здесь и там.

0 голосов
/ 28 августа 2018

Я не могу вдаваться в технические детали, но вот несколько практических отличий:

  • Flutter Hot Reload намного быстрее, чем Instant Run
  • Мгновенный запуск иногда дает сбой и вызывает полное восстановление, что может занять несколько минут.
  • Flutter Hot Reload назначается автоматически, когда вы сохраняете файл, и никаких задержек нет. Мгновенный запуск вызывает большое отставание, которое отвлекает.
  • Никакое состояние не теряется при Flutter Hot Reload, тогда как при использовании Instant Run часто происходит сброс приложения
  • Flutter также позволяет перезапустить приложение (сброс состояния) менее чем за секунду (может занять минуты в Android)
  • Flutter Hot Reload также работает, когда приложение находится в фоновом режиме
  • При внесении изменений в собственную оболочку Android и iOS вашего приложения Flutter, Flutter Hot Reload вам не поможет. Вы должны сделать полную перестройку с Gradle / XCode (которая также сбросит состояние)
...