راه‌اندازی مجدد داغ (Hot Restart) در توسعه موبایل — ماهیت، مکانیسم و اصل کار

نویسنده: IT Sectr منتشر شده: 2026-05-18 زمان مطالعه: 8 دقیقه

راه‌اندازی مجدد داغ (Hot Restart) مکانیسمی برای بارگذاری مجدد سریع برنامه موبایل در فرآیند توسعه است که طی آن برنامه کاملاً با کد منبع به‌روز شده راه‌اندازی مجدد می‌شود. برخلاف کامپایل مجدد کامل، Hot Restart از کد باینری قبلاً کامپایل شده استفاده می‌کند و فقط Dart VM را بارگذاری مجدد می‌کند و زمان چرخه توسعه را کاهش می‌دهد. طبق Flutter documentation (2025)، یک Hot Restart معمولی 1 تا 3 ثانیه طول می‌کشد. Hot Restart به ویژه هنگام تغییر حالت سراسری برنامه و کد مقداردهی اولیه مفید است.

نکات اصلی

  • Hot Restart — راه‌اندازی مجدد کامل برنامه با کد به‌روز شده که طی آن Dart VM بارگذاری مجدد می‌شود و حالت برنامه به حالت اولیه بازنشانی می‌شود.
  • Hot Reload — بارگذاری افزایشی تغییرات بدون از دست دادن حالت جاری برنامه، بسیار سریع‌تر از Hot Restart عمل می‌کند.
  • Dart VM در Hot Restart کاملاً راه‌اندازی مجدد می‌شود که اعمال همه تغییرات از جمله مقداردهی اولیه و متغیرهای ایستا را تضمین می‌کند.
  • اصل کار شامل کامپایل مجدد فایل‌های تغییر یافته، راه‌اندازی مجدد Dart VM و مقداردهی اولیه مجدد برنامه در 1–3 ثانیه است.
  • سناریوهای استفاده — تغییر متغیرهای سراسری، پیکربندی‌ها، کانتینرهای DI و کد مقداردهی اولیه که نیاز به بازنشانی کامل حالت دارند.

راه‌اندازی مجدد داغ (Hot Restart) چیست؟

راه‌اندازی مجدد داغ (Hot Restart) مکانیسمی توسعه است که طی آن برنامه بدون نیاز به کامپایل مجدد کامل پروژه، با کد منبع به‌روز شده کاملاً بارگذاری مجدد می‌شود. توسعه‌دهنده تغییرات را در کد اعمال می‌کند، فایل را ذخیره می‌کند و از طریق IDE فرمان راه‌اندازی مجدد را ارسال می‌کند. برنامه فایل‌های تغییر یافته را دوباره کامپایل می‌کند، Dart VM را راه‌اندازی مجدد می‌کند و کل چرخه زندگی را از main تا رندر نهایی رابط کاربری دوباره طی می‌کند.

Hot Restart با بازسازی کامل تفاوت دارد زیرا از کتابخانه‌های باینری قبلاً کامپایل شده و فریم‌ورک Flutter بدون کامپایل مجدد پوشش‌های بومی استفاده می‌کند. این کار زمان چرخه توسعه را از چند دقیقه به چند ثانیه کاهش می‌دهد. طبق نظرسنجی توسعه‌دهندگان Flutter (2024)، میانگین زمان Hot Restart 2.1 ثانیه است که حدود 97٪ سریع‌تر از بازسازی کامل پروژه از طریق دستور flutter build است.

این مکانیسم به ویژه در توسعه رابط‌های کاربری که نیاز به بررسی مکرر تغییرات بصری دارند، مورد تقاضا است. توسعه‌دهنده می‌تواند رنگ، اندازه یا موقعیت یک عنصر را تغییر دهد و بلافاصله نتیجه را روی شبیه‌ساز یا دستگاه فیزیکی ببیند، بدون اینکه زمینه توسعه را برای کامپایل طولانی از دست بدهد. این کار نمونه‌سازی تکراری را به طور چشمگیری سرعت می‌بخشد.

مکانیسم Hot Restart چگونه کار می‌کند؟

هنگام اجرای دستور 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

Flutter از معماری استفاده می‌کند که در آن کد Dart روی Dart VM اجرا می‌شود و UI از طریق موتور Skia یا Impeller رندر می‌شود. در Hot Restart ابزارهای Flutter نمونه ایزوله شده Dart VM (isolate) را راه‌اندازی مجدد می‌کنند، فایل‌های .dill به‌روز شده (Dart Intermediate Language) را بارگذاری می‌کنند و تابع main را دوباره اجرا می‌کنند. کل UI از طریق فراخوانی runApp دوباره ساخته می‌شود که به‌روز بودن همه ویجت‌ها را تضمین می‌کند.

dart
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 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 تغییر دهید. این کار زمان انتظار را به حداقل می‌رساند و بهره‌وری توسعه را در سطح بالایی حفظ می‌کند.

پیاده‌سازی Hot Restart در فریم‌ورک‌های محبوب

مکانیسم راه‌اندازی مجدد داغ بسته به فریم‌ورک و زبان برنامه‌نویسی متفاوت پیاده‌سازی می‌شود. Flutter بالغ‌ترین پیاده‌سازی Hot Restart را از طریق کامپایل JIT Dart VM ارائه می‌دهد، و React Native از مکانیسم مشابهی از طریق Metro Bundler و JavaScript Core یا Hermes استفاده می‌کند.

Hot Restart در Flutter

در Flutter، Hot Restart با دستور r در ترمینال پس از راه‌اندازی برنامه از طریق flutter run فعال می‌شود. به عنوان جایگزین — دکمه Hot Restart در Android Studio، VS Code یا IntelliJ IDEA. Hot Restart فقط در حالت debug کار می‌کند و در بیلدهای profile و release در دسترس نیست. در حین اجرا، ابزارهای Flutter فایل‌های تغییر یافته را در قالب kernel دوباره کامپایل کرده و به دستگاه ارسال می‌کنند.

dart
// قبل از 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 استفاده می‌شود.

Hot Restart در React Native

در 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 در توسعه استفاده کنیم

Hot Restart ابزاری ضروری در تعدادی از سناریوهای توسعه است. اولین و واضح‌ترین — تغییر پیکربندی سراسری برنامه: تم‌های طراحی، بومی‌سازی، تأمین‌کنندگان حالت. اگر تأمین‌کننده را در ریشه درخت ویجت تغییر داده‌اید یا ماژول جدیدی به کانتینر DI اضافه کرده‌اید، Hot Restart مقداردهی اولیه صحیح همه کامپوننت‌ها را تضمین می‌کند.

سناریوی دوم — تغییر متغیرهای ایستا و ثابت‌ها. در Dart، فیلدهای ایستا یک بار هنگام بارگذاری کلاس مقداردهی اولیه می‌شوند. Hot Reload تغییرات فیلدهای ایستا را اعمال نمی‌کند، بنابراین برای به‌روزرسانی آنها Hot Restart الزامی است. این موضوع به ویژه هنگام کار با ثابت‌های پیکربندی، آدرس‌های URL API و پرچم‌های ویژگی‌ها مهم است.

سناریوی سوم — دیباگ مقداردهی اولیه: بررسی عملکرد تابع main، صفحه splash، بارگذاری وابستگی‌ها. در هر Hot Restart برنامه چرخه کامل مقداردهی اولیه را طی می‌کند که امکان شناسایی خطاهایی که فقط در هنگام راه‌اندازی رخ می‌دهند — مشکلات SharedPreferences، خطاهای اتصال به پایگاه داده، تایم‌اوت‌های مقداردهی اولیه را فراهم می‌کند.

سناریوی چهارم — تست حالت خالی. Hot Restart کل حالت برنامه را بازنشانی می‌کند که امکان بررسی رفتار در اولین راه‌اندازی را فراهم می‌کند: نمایش راهنما، درخواست مجوزها، لیست‌های خالی و جایگزین‌ها. برای تست تکراری این کار بسیار سریع‌تر از نصب مجدد برنامه است.

سوالات متداول

Hot Restart چه تفاوتی با Hot Reload دارد؟

Hot Restart برنامه و Dart VM را کاملاً راه‌اندازی مجدد می‌کند و حالت را به حالت اولیه بازنشانی می‌کند. Hot Reload تغییرات را در برنامه در حال اجرا تزریق می‌کند و حالت جاری UI را حفظ می‌کند. Hot Reload سریع‌تر است،但对于 تغییرات مقداردهی اولیه و متغیرهای سراسری قابل استفاده نیست.

چگونه Hot Restart را در Flutter اجرا کنیم؟

در ترمینال پس از اجرای flutter run، کلید R (Shift+R) را برای Hot Restart فشار دهید. در Android Studio یا VS Code از دکمه Hot Restart در پنل دیباگ استفاده کنید. فرمان فقط در حالت debug در دسترس است.

Hot Restart چقدر طول می‌کشد؟

زمان معمول Hot Restart برای پروژه‌های متوسط 1 تا 3 ثانیه است. زمان به تعداد فایل‌های Dart، پیچیدگی درخت ویجت و عملکرد دستگاه بستگی دارد. برای پروژه‌های بزرگ، زمان ممکن است به 5–8 ثانیه برسد.

آیا Hot Restart در بیلد release کار می‌کند؟

خیر، Hot Restart فقط در حالت debug در دسترس است. در بیلدهای release و profile از کامپایل AOT استفاده می‌شود که از بارگذاری مجدد داغ پشتیبانی نمی‌کند. برای به‌روزرسانی کد در release نیاز به بازسازی کامل است.

آیا می‌توان از Hot Restart با پلاگین‌های بومی استفاده کرد؟

Hot Restart بر کد بومی — پلاگین‌های Kotlin، Swift یا Java تأثیر نمی‌گذارد. اگر تغییرات در کد بومی پلاگین اعمال شود، بازسازی کامل پروژه مورد نیاز است. Hot Restart فقط برای لایه Dart برنامه مؤثر است.

خلاصه

  • Hot Restart — مکانیسم راه‌اندازی مجدد کامل برنامه با کد Dart به‌روز شده، بازنشانی حالت به حالت اولیه.
  • تفاوت با Hot Reload — راه‌اندازی مجدد کامل Dart VM و مقداردهی اولیه مجدد همه کامپوننت‌ها، از جمله متغیرهای سراسری و فیلدهای ایستا.
  • زمان اجرا — 1–3 ثانیه برای پروژه معمولی، 97٪ سریع‌تر از بازسازی کامل از طریق flutter build.
  • سناریوهای استفاده — تغییر پیکربندی سراسری، متغیرهای ایستا، کانتینرهای DI و کد مقداردهی اولیه.
  • محدودیت‌ها — برای کد بومی (Kotlin/Swift) اعمال نمی‌شود، فقط در حالت debug در دسترس است، حالت دیباگ را بازنشانی می‌کند.
  • استراتژی استفاده — Hot Reload برای ویرایش‌های UI، Hot Restart برای تغییرات معماری و مقداردهی اولیه، بازسازی کامل برای کد بومی.
  • پیاده‌سازی — Flutter از کامپایل JIT Dart VM استفاده می‌کند، React Native — Metro Bundler با بارگذاری مجدد موتور JS.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید