راهاندازی مجدد داغ (Hot Restart) مکانیسمی برای بارگذاری مجدد سریع برنامه موبایل در فرآیند توسعه است که طی آن برنامه کاملاً با کد منبع بهروز شده راهاندازی مجدد میشود. برخلاف کامپایل مجدد کامل، Hot Restart از کد باینری قبلاً کامپایل شده استفاده میکند و فقط Dart VM را بارگذاری مجدد میکند و زمان چرخه توسعه را کاهش میدهد. طبق Flutter documentation (2025)، یک Hot Restart معمولی 1 تا 3 ثانیه طول میکشد. Hot Restart به ویژه هنگام تغییر حالت سراسری برنامه و کد مقداردهی اولیه مفید است.
نکات اصلی
راهاندازی مجدد داغ (Hot Restart) مکانیسمی توسعه است که طی آن برنامه بدون نیاز به کامپایل مجدد کامل پروژه، با کد منبع بهروز شده کاملاً بارگذاری مجدد میشود. توسعهدهنده تغییرات را در کد اعمال میکند، فایل را ذخیره میکند و از طریق IDE فرمان راهاندازی مجدد را ارسال میکند. برنامه فایلهای تغییر یافته را دوباره کامپایل میکند، Dart VM را راهاندازی مجدد میکند و کل چرخه زندگی را از main تا رندر نهایی رابط کاربری دوباره طی میکند.
Hot Restart با بازسازی کامل تفاوت دارد زیرا از کتابخانههای باینری قبلاً کامپایل شده و فریمورک Flutter بدون کامپایل مجدد پوششهای بومی استفاده میکند. این کار زمان چرخه توسعه را از چند دقیقه به چند ثانیه کاهش میدهد. طبق نظرسنجی توسعهدهندگان Flutter (2024)، میانگین زمان Hot Restart 2.1 ثانیه است که حدود 97٪ سریعتر از بازسازی کامل پروژه از طریق دستور flutter build است.
این مکانیسم به ویژه در توسعه رابطهای کاربری که نیاز به بررسی مکرر تغییرات بصری دارند، مورد تقاضا است. توسعهدهنده میتواند رنگ، اندازه یا موقعیت یک عنصر را تغییر دهد و بلافاصله نتیجه را روی شبیهساز یا دستگاه فیزیکی ببیند، بدون اینکه زمینه توسعه را برای کامپایل طولانی از دست بدهد. این کار نمونهسازی تکراری را به طور چشمگیری سرعت میبخشد.
هنگام اجرای دستور Hot Restart دنبالهای از عملیات رخ میدهد: ذخیره فایلهای تغییر یافته، کامپایل افزایشی فایلهای Dart تغییر یافته به کد ماشین، راهاندازی مجدد Dart VM و اجرای مجدد نقطه ورودی برنامه. Dart VM یک ماشین مجازی است که کد Dart را در حالت JIT (Just-In-Time) در طول توسعه و AOT (Ahead-Of-Time) در بیلدهای تولیدی اجرا میکند.
در Hot Restart برنامه چرخه زندگی کاملی را طی میکند: فراخوانی تابع main، مقداردهی اولیه WidgetsFlutterBinding، اجرای runApp و ساخت کل درخت ویجت از صفر. تمام حالتهای قبلی ویجتها، متغیرها و حافظههای پنهان پاک میشوند. این تضمین میکند که برنامه در حالت تمیزی قرار دارد که کاملاً مشابه حالت پس از نصب تازه روی دستگاه است.
این فرآیند را میتوان به صورت دنبالهای از مراحل نشان داد: توسعهدهنده دکمه Hot Restart را در IDE فشار میدهد، ابزارهای Flutter فرمان را به دستگاه ارسال میکنند، دستگاه اسکلت برنامه فعلی را ذخیره میکند، Dart VM را با کد جدید راهاندازی مجدد میکند و main را دوباره اجرا میکند. تمام وابستگیهای ثبت شده در کانتینر تزریق وابستگی از صفر دوباره ایجاد میشوند.
ویژگی کلیدی — کد باینری پوشش بومی (پلاگینها، کد Kotlin، کد Swift) کامپایل مجدد نمیشود. Hot Restart فقط لایه Dart برنامه را تحت تأثیر قرار میدهد که سرعت بالای راهاندازی مجدد را تضمین میکند. اگر تغییرات بر کد بومی تأثیر بگذارند، اجرای کامل flutter build مورد نیاز است.
Flutter از معماری استفاده میکند که در آن کد Dart روی Dart VM اجرا میشود و UI از طریق موتور Skia یا Impeller رندر میشود. در Hot Restart ابزارهای Flutter نمونه ایزوله شده Dart VM (isolate) را راهاندازی مجدد میکنند، فایلهای .dill بهروز شده (Dart Intermediate Language) را بارگذاری میکنند و تابع main را دوباره اجرا میکنند. کل UI از طریق فراخوانی runApp دوباره ساخته میشود که بهروز بودن همه ویجتها را تضمین میکند.
import 'package:flutter/material.dart';
void main() {
// پس از Hot Restart این تابع دوباره اجرا میشود
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart و Hot Reload دو مکانیسم توسعه سریع هستند که اغلب اشتباه گرفته میشوند. Hot Reload تغییرات را در برنامه در حال اجرا بدون از دست دادن حالت جاری بارگذاری میکند، در حالی که Hot Restart برنامه را کاملاً راهاندازی مجدد میکند. Hot Reload سریعتر عمل میکند (0.1–1 ثانیه)، اما تغییرات مربوط به مقداردهی اولیه یا فیلدهای ایستای کلاس را اعمال نمیکند.
تفاوت اصلی — حالت برنامه. Hot Reload حالت جاری ویجتها را حفظ میکند: موقعیت اسکرول، دادههای وارد شده، پنجرههای مودال باز. Hot Restart کل حالت را به حالت اولیه بازنشانی میکند. اگر تغییر فقط به کد در متد build مربوط شود، Hot Reload کافی است. اگر تغییر بر main، متغیرهای سراسری یا وابستگیها تأثیر بگذارد — Hot Restart مورد نیاز است.
Hot Reload تغییرات را با تزریق کد بهروز شده به Dart VM بدون راهاندازی مجدد isolate اعمال میکند. این فقط برای تغییراتی امکانپذیر است که ساختار نوع را نقض نمیکنند و نیاز به مقداردهی اولیه مجدد ویجتها ندارند. در Hot Restart isolate کاملاً راهاندازی مجدد میشود که امکان اعمال هرگونه تغییری از جمله حذف یا تغییر نام کلاسها و متدها را فراهم میکند.
طبق گزارش تیم Flutter، Hot Reload برای اکثر تغییرات کمتر از 1 ثانیه طول میکشد، در حالی که Hot Restart 1 تا 3 ثانیه طول میکشد. برای حدود 80٪ تغییرات رابط کاربری، Hot Reload کافی است. Hot Restart هنگام تغییر پیکربندیهای برنامه، متغیرهای سراسری، پلاگینهای بومی در پوشش Dart و تصمیمات معماری مورد نیاز است.
استراتژی زیر توصیه میشود: از Hot Reload برای ویرایشهای بصری UI و تغییرات کوچک منطق استفاده کنید؛ هنگام تغییر ساختار داده، افزودن وابستگیها یا ویرایش کد مقداردهی اولیه به Hot Restart تغییر دهید. این کار زمان انتظار را به حداقل میرساند و بهرهوری توسعه را در سطح بالایی حفظ میکند.
مکانیسم راهاندازی مجدد داغ بسته به فریمورک و زبان برنامهنویسی متفاوت پیادهسازی میشود. Flutter بالغترین پیادهسازی Hot Restart را از طریق کامپایل JIT Dart VM ارائه میدهد، و React Native از مکانیسم مشابهی از طریق Metro Bundler و JavaScript Core یا Hermes استفاده میکند.
در Flutter، Hot Restart با دستور r در ترمینال پس از راهاندازی برنامه از طریق flutter run فعال میشود. به عنوان جایگزین — دکمه Hot Restart در Android Studio، VS Code یا IntelliJ IDEA. Hot Restart فقط در حالت debug کار میکند و در بیلدهای profile و release در دسترس نیست. در حین اجرا، ابزارهای Flutter فایلهای تغییر یافته را در قالب kernel دوباره کامپایل کرده و به دستگاه ارسال میکنند.
// قبل از Hot Restart: نسخه قدیمی
class Counter extends StatefulWidget {
final int initialValue = 0;
// پس از Hot Restart: مقدار جدید اعمال خواهد شد
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload _count را حفظ میکند، Hot Restart به 0 بازنشانی میکند
}
محدودیت Hot Restart در Flutter — عدم امکان حفظ حالت دیباگ. پس از راهاندازی مجدد، تمام نقاط توقف حفظ میشوند، اما مقادیر متغیرها در دیباگر بازنشانی میشوند. برای حفظ حالت بین راهاندازیهای مجدد از مکانیسمهای ذخیره حالت برنامه State Restoration استفاده میشود.
در React Native، راهاندازی مجدد داغ از طریق Metro Bundler — بستهبند ماژولهای JavaScript پیادهسازی میشود. هنگام تغییر کد، Metro ماژولهای تغییر یافته را دوباره میسازد و باندل بهروز شده را به دستگاه ارسال میکند. React Native از Fast Refresh پشتیبانی میکند — مشابه Hot Reload که حالت کامپوننتهای تابعی را با استفاده از hooks React حفظ میکند.
راهاندازی مجدد کامل (Reload) در React Native موتور JavaScript و کل برنامه را به طور کامل بارگذاری مجدد میکند. این کاملاً مشابه Hot Restart در Flutter است. برای اجرا از ترکیب Cmd+R در شبیهساز iOS یا فشار دو باره R در Android استفاده میشود. زمان راهاندازی مجدد کامل در React Native بسته به اندازه باندل از 2 تا 8 ثانیه متغیر است.
Hot Restart ابزاری ضروری در تعدادی از سناریوهای توسعه است. اولین و واضحترین — تغییر پیکربندی سراسری برنامه: تمهای طراحی، بومیسازی، تأمینکنندگان حالت. اگر تأمینکننده را در ریشه درخت ویجت تغییر دادهاید یا ماژول جدیدی به کانتینر DI اضافه کردهاید، Hot Restart مقداردهی اولیه صحیح همه کامپوننتها را تضمین میکند.
سناریوی دوم — تغییر متغیرهای ایستا و ثابتها. در Dart، فیلدهای ایستا یک بار هنگام بارگذاری کلاس مقداردهی اولیه میشوند. Hot Reload تغییرات فیلدهای ایستا را اعمال نمیکند، بنابراین برای بهروزرسانی آنها Hot Restart الزامی است. این موضوع به ویژه هنگام کار با ثابتهای پیکربندی، آدرسهای URL API و پرچمهای ویژگیها مهم است.
سناریوی سوم — دیباگ مقداردهی اولیه: بررسی عملکرد تابع main، صفحه splash، بارگذاری وابستگیها. در هر Hot Restart برنامه چرخه کامل مقداردهی اولیه را طی میکند که امکان شناسایی خطاهایی که فقط در هنگام راهاندازی رخ میدهند — مشکلات SharedPreferences، خطاهای اتصال به پایگاه داده، تایماوتهای مقداردهی اولیه را فراهم میکند.
سناریوی چهارم — تست حالت خالی. Hot Restart کل حالت برنامه را بازنشانی میکند که امکان بررسی رفتار در اولین راهاندازی را فراهم میکند: نمایش راهنما، درخواست مجوزها، لیستهای خالی و جایگزینها. برای تست تکراری این کار بسیار سریعتر از نصب مجدد برنامه است.
سوالات متداول
Hot Restart برنامه و Dart VM را کاملاً راهاندازی مجدد میکند و حالت را به حالت اولیه بازنشانی میکند. Hot Reload تغییرات را در برنامه در حال اجرا تزریق میکند و حالت جاری UI را حفظ میکند. Hot Reload سریعتر است،但对于 تغییرات مقداردهی اولیه و متغیرهای سراسری قابل استفاده نیست.
در ترمینال پس از اجرای flutter run، کلید R (Shift+R) را برای Hot Restart فشار دهید. در Android Studio یا VS Code از دکمه Hot Restart در پنل دیباگ استفاده کنید. فرمان فقط در حالت debug در دسترس است.
زمان معمول Hot Restart برای پروژههای متوسط 1 تا 3 ثانیه است. زمان به تعداد فایلهای Dart، پیچیدگی درخت ویجت و عملکرد دستگاه بستگی دارد. برای پروژههای بزرگ، زمان ممکن است به 5–8 ثانیه برسد.
خیر، Hot Restart فقط در حالت debug در دسترس است. در بیلدهای release و profile از کامپایل AOT استفاده میشود که از بارگذاری مجدد داغ پشتیبانی نمیکند. برای بهروزرسانی کد در release نیاز به بازسازی کامل است.
Hot Restart بر کد بومی — پلاگینهای Kotlin، Swift یا Java تأثیر نمیگذارد. اگر تغییرات در کد بومی پلاگین اعمال شود، بازسازی کامل پروژه مورد نیاز است. Hot Restart فقط برای لایه Dart برنامه مؤثر است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید