Hot Restart في تطوير التطبيقات المحمولة — الجوهر، الآلية ومبدأ العمل

المؤلف: IT Sectr نُشر: 2026-05-18 وقت القراءة: 8 دق

Hot Restart هو آلية إعادة تحميل سريعة لتطبيق الجوال أثناء التطوير، حيث يتم إعادة تشغيل التطبيق بالكامل مع كود مصدر محدث. بالخلاف من إعادة الترجمة الكاملة، يستخدم Hot Restart كوداً ثنائياً مجمعاً مسبقاً ويعيد تحميل Dart VM فقط، مما يقلل وقت دورة التطوير. وفقًا لـ توثيق Flutter (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 هو آلية تطوير حيث يتم إعادة تحميل التطبيق بالكامل مع كود مصدر محدث دون الحاجة إلى إعادة ترجمة كاملة للمشروع. يقوم المطور بإجراء تغييرات على الكود، وحفظ الملف، وإرسال أمر إعادة التشغيل من خلال بيئة التطوير المتكاملة. يقوم التطبيق بإعادة ترجمة الملفات المغيرة، وإعادة تشغيل 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

خلال Hot Restart، يمر التطبيق بدورة حياة كاملة: استدعاء دالة main، تهيئة WidgetsFlutterBinding، تشغيل runApp وبناء شجرة الويدجت بالكامل من الصفر. تتم مسح جميع حالات الويدجت السابقة والمتغيرات والذاكرات المؤقتة. يضمن ذلك أن التطبيق في حالة نظيفة، مطابقة تمامًا للحالة بعد تثبيت جديد على الجهاز.

يمكن تمثيل العملية كتسلسل من الخطوات: يضغط المطور زر Hot Restart في بيئة التطوير المتكاملة، وترسل أدوات Flutter أمرًا إلى الجهاز، ويحفظ الجهاز الهيكل الأساسي للتطبيق الحالي، ويعيد تشغيل Dart VM بالكود الجديد ويعيد تشغيل main. تتم إعادة إنشاء جميع التبعيات المسجلة في حاوية حقن التبعيات من الصفر.

الميزة الرئيسية هي أن الكود الثنائي للغلاف الأصلي (الإضافات، كود Kotlin، كود Swift) لا يتم إعادة ترجمته. يؤثر Hot Restart فقط على طبقة Dart من التطبيق، مما يضمن سرعة عالية لإعادة التشغيل. إذا كانت التغييرات تؤثر على الكود الأصلي، فهي تتطلب flutter build كامل.

التنفيذ التقني في Flutter

يستخدم Flutter معمارية حيث يتم تنفيذ كود Dart على Dart VM ويتم تصدير واجهة المستخدم من خلال محرك Skia أو Impeller. خلال Hot Restart، تقوم أدوات Flutter بإعادة تشغيل مثال منعزل لـ Dart VM (isolate)، وتحميل ملفات .dill المحدثة (Dart Intermediate Language)، وإعادة تشغيل دالة main. يتم إعادة بناء واجهة المستخدم بالكامل من خلال استدعاء 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 أقل من ثانية واحدة لمعظم التغييرات، بينما يستغرق Hot Restart من 1 إلى 3 ثوان. لحوالي 80% من تغييرات واجهة المستخدم، يكفي Hot Reload. يتم الحاجة إلى Hot Restart عند تغيير تكوينات التطبيق، المتغيرات العامة، الإضافات الأصلية في غلاف Dart والقرارات المعمارية.

توصى الاستراتيجية التالية: استخدم Hot Reload لـ التعديلات المرئية لواجهة المستخدم وتغييرات المنطق الصغيرة؛ تبديل إلى 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 لتحديثها. هذا ذو صلة خاصة عند العمل مع ثوابت التكوين، عناوين API وأعلام الوظائف.

السيناريو الثالث هو تصحيح التهيئة: التحقق من عمل دالة main، شاشة البدء، تحميل التبعيات. مع كل Hot Restart، يمر التطبيق بدورة تهيئة كاملة، مما يسمح بتحديد الأخطاء التي تحدث فقط عند البدء — مشاكل SharedPreferences، أخطاء اتصال قاعدة البيانات، انتهاء المهلة الزمنية للتهيئة.

السيناريو الرابع هو اختبار الحالة الفارغة. Hot Restart يعيد تعيين كل حالة التطبيق، مما يسمح لك باختبار السلوك عند التشغيل الأول: عرض الترحيب، طلب الأذونات، القوائم الفارغة وشاشات النائب. للاختبار المتكرر، هذا أسرع بشكل كبير من إعادة تثبيت التطبيق.

الأسئلة الشائعة

ما الفرق بين Hot Restart و Hot Reload؟

Hot Restart يعيد تشغيل التطبيق و Dart VM بالكامل، مع إعادة تعيين الحالة إلى الابتدائية. Hot Reload يحقن التغييرات في التطبيق العامل، محافظًا على حالة واجهة المستخدم الحالية. 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 لتعديلات واجهة المستخدم، Hot Restart لتغييرات الهيكلة والتهيئة، إعادة بناء كاملة للكود الأصلي.
  • التطبيق — Flutter يستخدم ترجمة JIT لـ Dart VM، React Native يستخدم Metro Bundler مع إعادة تحميل محرك JS.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا