Hot Reload mobil tətbiqlər üçün: bu nədir, iş prinsipi və mexanizmləri

Müəllif: IT Sectr Dərc olunub: 2026-05-17 Oxuma vaxtı: 10 dəq

Hot Reload — işləyən mobil tətbiqin kodunu yenidən başlatmadan və cari vəziyyəti itirmədən yeniləməyə imkan verən texnologiya. Tərtibatçı mənbə kodunu dəyişir — bir saniyə sonra dəyişikliklər cihazın və ya emulyatorun ekranında göstərilir. Bu, Flutter və React Native-in əsas xüsusiyyətidir, inkişaf iterasiyalarını köklü şəkildə sürətləndirir: redaktə-baxış dövrünün vaxtı 5–10 saniyədən (yenidən qurma) 300–500 millisaniyəyə qədər azalır. Flutter Documentation, 2025-ə görə, hot reload dəyişdirilmiş kodun inkremental kompilasiyasını həyata keçirir və yeniləməni Dart VM-ə göndərir.

Əsas məqamlar

  • Hot Reload — tətbiqi yenidən başlatmadan, cari ekran vəziyyətini qoruyaraq kodun yenilənməsi.
  • Dart VM Flutter-də funksiyaların isti dəyişdirilməsi (hot patching) ilə JIT-kompilyasiyadan istifadə edir.
  • React Native Metro bundler vasitəsilə JavaScript modullarının injeksiyası ilə Fast Refresh tətbiq edir.
  • Hot Restart — uyğun olmayan dəyişikliklərdə istifadə olunan, vəziyyətin itirilməsi ilə tətbiqin tam yenidən yüklənməsi.
  • Stateful hot reload dəyişikliklər strukturu pozmursa, vidjetlərin, dəyişənlərin və naviqasiyanın vəziyyətini qoruyur.

Hot Reload nədir?

Hot Reload — mənbə kodunun dəyişdirildiyi və dayandırılmadan artıq işləyən tətbiqə tətbiq edildiyi inkişaf mexanizmi. Tərtibatçı faylı redaktə edir, yadda saxlayır və 0.3–2 saniyə sonra yenilənmiş interfeys ekranda görünür. Tətbiqin vəziyyəti (sayğaclar, sürüşdürmə mövqeyi, daxil edilmiş məlumatlar) qorunur — tərtibatçı konteksti itirmir.

Hot reload konsepsiyası erkən veb alətlərində (LiveReload, 2010) yaranmış və Flutter (2017) və React Native (2015) çərçivələri tərəfindən mobil inkişaf üçün uyğunlaşdırılmışdır. Bu gün hot reload müasir mobil çərçivələrin məcburi funksiyasıdır, debug konfiqurasiyası və profilləşdirmə ilə yanaşı. Hot reload olmadan UI inkişafı səmərəsiz hesab olunur: hər dəyişikliyə baxmaq üçün 10–30 saniyə yenidən qurma və işə salma tələb olunur.

Texniki olaraq hot reload üç addımdan ibarətdir: dəyişikliyin aşkarlanması (file watcher), dəyişdirilmiş kodun kompilasiyası (incremental compiler) və tətbiqi (hot patching). Hər çərçivə bu addımları özünəməxsus şəkildə həyata keçirir, lakin nəticə eynidir: redaktə və göstərmə arasında minimal gecikmə.

Flutter-də Hot Reload necə işləyir

Flutter-də Hot Reload Dart VM arxitekturasına və JIT-kompilyasiyaya əsaslanır. Tərtibatçı IDE-də „Hot Reload” düyməsini kliklədikdə və ya faylı yadda saxladıqda, Flutter dəyişdirilmiş Dart kitabxanalarının inkremental kompilasiyasını kernel fayllarına (.dill) həyata keçirir. Dart VM bu faylları yükləyir və işləyən tətbiqdə dəyişdirilmiş funksiyaların tətbiqlərini əvəz edir.

dart
// Hot reload zamanı saxlanılan vəziyyətə malik Flutter vidjeti
class CounterWidget extends StatefulWidget {
    @override
    State createState() => _CounterState();
}

class _CounterState extends State {
    int _counter = 0;

    @override
    Widget build(BuildContext context) {
        return Column(
            children: [
                Text('Sayğac: $_counter'),
                ElevatedButton(
                    onPressed: () => setState(() => _counter++),
                    child: Text('Artır'),
                ),
            ],
        );
    }
}

Nümunədə StatefulWidget CounterWidget hot reload zamanı _counter sahəsini qoruyur. Dart VM reassemble() çağıraraq vəziyyəti (State) yenidən yaradır, lakin _counter-i sıfırlamır — vidjet tamamilə yenidən yaradılmırsa, dəyər qorunur. Flutter bütün State obyektləri üçün reassemble() çağırır və build() cari kod və qorunan vəziyyətlə yenidən işə düşür.

Hot reload nə vaxt işləmir: statik dəyişən (static const), qlobal dəyişən, main(), enum/mixin sinif elanı, @override initState() kodu dəyişdirildikdə. Bu hallarda Hot Restart tələb olunur. Flutter Team (2025) məlumatlarına görə, hot reload 85–90% hallarda uğurlu olur; 10–15% dəyişiklik tam yenidən başlatma tələb edir.

Dart VM JIT və kernel faylları

Dart VM debug rejimində JIT-kompilyator kimi işləyir: Dart kodunu kernel formatı (bayt kodun analoqu) vasitəsilə interpretasiya edir. Hot reload yeni kernel faylını yükləyir və köhnə funksiya təriflərini əvəz edir. VM izolyatları (isolates) yenidən başlatmır — bütün asinxron əməliyyatlar (Future, Stream) işləməyə davam edir. Release rejimində Dart AOT (dart2native) ilə kompilə edilir və hot reload mövcud deyil.

React Native-də Fast Refresh necə işləyir

Fast Refresh (əvvəllər Hot Reloading) React Native-də Metro bundler — fayl dəyişikliklərini izləyən JavaScript modul bündlerindən istifadə edir. Tərtibatçı faylı yadda saxladıqda, Metro yalnız dəyişdirilmiş modulu (HMR — Hot Module Replacement) kompilə edir və WebSocket vasitəsilə işləyən tətbiqə yeniləmə göndərir.

js
// Hot reload zamanı vəziyyəti qoruyan React Native komponenti
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';

const Counter = () => {
    const [count, setCount] = useState(0);

    return (
        <View>
            <Text>Sayğac: {count}Text>
            <Button title="Artır"
                onPress={() => setCount(c => c + 1)} />
        View>
    );
};

Fast Refresh modul yeniləməsi zamanı React vəziyyətini (useState, useReducer) qoruyur. Metro HMR yalnız dəyişdirilmiş modulun diff-ni ötürür — bütün bündlı yox. React Native React komandası (Dan Abramov, 2019) tərəfindən hazırlanmış React Fast Refresh-dən istifadə edir: komponent üçün yeni render yaradır, lakin komponentin imzası dəyişməyibsə, hook vəziyyətlərini və propsları qoruyur.

Fast Refresh aşağıdakı dəyişikliklərdə işləmir: komponentin export-ı, hooklar (useEffect, useMemo), modul asılılıqları və native modullar (Java/Objective-C). Belə dəyişikliklər üçün Reload (JS-bündlın tam yenidən yüklənməsi) və ya Rebuild (native kodun yenidən qurulması) tələb olunur. Fast refresh vaxtı — 200–800 ms, tam reload — 2–5 saniyə.

Hot Reload vs Hot Restart: müqayisə

Hot Reload və Hot Restart — müxtəlif istifadə ssenariləri olan iki kod yeniləmə rejimi. Hot Reload sinif strukturu və vəziyyət tipi dəyişmədikdə UI dəyişiklikləri (stil, layout, rənglər, mətnlər) üçün uyğundur. Hot Restart metod imzalarının dəyişdirilməsi, kök ağacda yeni vidjetlərin/komponentlərin əlavə edilməsi, initState və native modulların dəyişdirilməsi zamanı zəruridir.

XüsusiyyətHot ReloadHot Restart
Sürət0.3–2 saniyə2–10 saniyə
Vəziyyətin qorunmasıBəli (dəyişənlər, state, naviqasiya yığını)Xeyr (tətbiq yenidən başlayır)
Kompilasiyaİnkremental (yalnız dəyişikliklər)Dart/JS-nin tam yenidən kompilə edilməsi
Nə vaxt istifadə edilməliUI düzəlişləri, stillər, mətnlər, layoutStruktur dəyişikliyi, yeni modullar, native kod
FlutterHot Reload (R)Hot Restart (Shift + R)
React NativeFast RefreshReload (Cmd + R)

Tövsiyə olunan strategiya: hot reload ilə başlamaq. Dəyişikliklər tətbiq edilməyibsə (IDE „Reload needed” göstərir) — hot restart edin. Flutter-də düymə işarəsi dəyişir: ildırım (⚡) hot reload üçün, xətlənmiş ildırım — restart tələb olunduqda. İnkişaf səmərəliliyi hot reload ilə tam yenidən qurmalarla müqayisədə 40–60% daha yüksəkdir (JetBrains Developer Survey 2024 məlumatları).

Tətbiq mexanizmləri: kod injeksiyası və isti dəyişdirmə

Kod injeksiyası (code injection) — bütün çərçivələr tərəfindən istifadə edilən ümumi hot reload mexanizmi. Üç fazadan ibarətdir. Birinci — dəyişikliyin aşkarlanması: file watcher (IDE-yə quraşdırılmış) və ya fayl sistemi (FSNotify) .dart, .js, .tsx faylında dəyişikliyi qeyd edir. İkinci — kompilasiya: inkremental kompilator yalnız dəyişdirilmiş faylı aralıq təsvirə (Dart üçün kernel .dill, JS üçün HMR-module) çevirir. Üçüncü — tətbiq: yeni kod cihaza ötürülür və işləyən tətbiqin yaddaşında köhnə tərifləri əvəz edir.

Funksiyaların isti dəyişdirilməsi (hot patching) — runtime-nın virtual metodlar cədvəlində funksiya göstəricisini (function pointer) əvəz etdiyi texnika. Dart VM ClassTable — bütün yüklənmiş sinifləri ehtiva edən daxili strukturdan istifadə edir. Hot reload zamanı VM sinfi ClassTable-da tapır və onun funksiya təriflərini kernel faylından yeni olanlarla əvəz edir. Bütün mövcud sinif nümunələri avtomatik olaraq yeni davranış alır.

dart
// Flutter: hot reload-dan sonra vəziyyətin idarə edilməsi üçün reassemble callbacki
class MyWidget extends StatefulWidget {
    @override
    State createState() => _MyState();
}

mixin ReloadAware on State {
    @override
    void reassemble() {
        super.reassemble();
        // Hot reload-dan sonra keşin və ya məlumatların sıfırlanması
        clearCache();
    }
}

Nümunədə ReloadAware mixini Dart VM-nin hot reload-dan sonra hər State obyektində çağırdığı reassemble() metodunu override edir. Tərtibatçı keşi sıfırlaya, resursları yenidən inicializasiya edə və ya vəziyyət miqrasiyası həyata keçirə bilər. Bu metod olmadan köhnə məlumatlar keşdə qala və vidjetlərin yenilənməsindən sonra uyğunsuzluğa səbəb ola bilər.

İsti dəyişdirmənin məhdudiyyətləri

İsti dəyişdirmə yeni sahələr üçün yaddaşın yenidən ayrılmasını, sinifdə dəyişən tipinin dəyişdirilməsini, StatefulWidget-ə yeni sahələrin əlavə edilməsini, enum dəyərlərinin və ya generic parametrlərinin dəyişdirilməsini tələb edən dəyişikliklər üçün işləmir. Bu dəyişikliklər yaddaşdakı mövcud obyektlərlə uyğun deyil — Dart VM artıq ayrılmış obyektlərdə sahələri „yenidən təşkil edə” bilməz. Belə hallarda isti yenidən başlatma (hot restart) və ya tam yenidən qurma tələb olunur.

Native inkişafda Hot Reload: Android və iOS

Native Android və iOS inkişafı ənənəvi olaraq tam hüquqlu hot reload-ə malik deyil. Android Studio Android 11+ və AGP 4.2+ ilə Apply Changes-i dəstəkləyir: tətbiqi yenidən başlatmadan kodun yenilənməsi. Apply Changes Android Runtime (ART) vasitəsilə işləyir — o, dex-fayllarda metod tətbiqlərini anında əvəz edir. Lakin Apply Changes məhduddur: resursların (layout.xml, drawable), manifestin və native kitabxanaların dəyişdirilməsi üçün işləmir.

Apple Xcode 15-də (2023) Previews (SwiftUI Preview) təqdim etdi — bu klassik mənada hot reload deyil. Previews önbaxış bölməsini əsas tətbiqdən ayrıca kompilə edir və nəticəni Xcode canvasında göstərir. Fayl yadda saxlanıldıqda Preview 1–3 saniyəyə yenilənir, lakin tətbiqin vəziyyəti qorunmur. UIKit layihələri üçün hot reload üçüncü tərəf alətləri ilə mövcuddur: InjectionIII (John Holdsworth) və SwiftHotReload.

Kotlin Multiplatform (KMP) 2024-cü ildən JetBrains tərəfindən eksperimental hot reload dəstəyi aldı. Mexanizm obyekt faylında (.klib) funksiyaların dəyişdirilməsi ilə Kotlin/Native runtime-ə əsaslanır. JetBrains Compose Multiplayer Flutter-ə bənzər öz hot reload tətbiqindən istifadə edir: inkremental kompilasiya və Kotlin/Native runtime-də siniflərin dəyişdirilməsi. Sürət — 1–3 saniyə, yalnız UI dəyişiklikləri üçün əlçatandır.

Android Studio-da Apply Changes: necə işləyir

Apply Changes — ART runtime API-dən istifadə edən Android Studio mexanizmi. Kod yadda saxlanıldıqda Android Studio hansı siniflərin dəyişdiyini müəyyən edir və onların dex fayllarını adb vasitəsilə cihaza göndərir. ART işləyən tətbiqdə metod tətbiqlərini dayandırmadan əvəz edir. Apply Changes üç rejimdə işləyir: Instant Run (metodun sürətli dəyişdirilməsi), Swap (nümunələrin yenidən yaradılması ilə sinfin dəyişdirilməsi) və Restart Activity (dəyişikliklər cari vəziyyətlə uyğun deyilsə).

Tez-tez verilən suallar

Hot Reload Live Reload-dan nə ilə fərqlənir?

Hot Reload tətbiqi yenidən başlatmadan kodu yeniləyir və vəziyyəti qoruyur. Live Reload fayllar dəyişdirildikdə bütün tətbiqi və ya veb-səhifəni tamamilə yenidən yükləyir. Live Reload tətbiqi daha sadədir, lakin daha yavaşdır və vəziyyəti itirir. Flutter və React Native hot reload, veb alətləri isə live reload istifadə edir.

Niyə Hot Reload həmişə işləmir?

Hot Reload yaddaşın yenidən ayrılmasını tələb edən dəyişikliklər (sinifin yeni sahələri), statik sabitlərin (static const) dəyişdirilməsi, vidjetlərin adlandırılması, enum və ya generic parametrlərinin dəyişdirilməsi zamanı işləmir. Bu dəyişikliklər Dart VM və ya JavaScript runtime yaddaşındakı mövcud obyektlərlə uyğun deyil.

Hot Reload fiziki cihazda işləyir?

Bəli, hot reload həm fiziki cihazda, həm də emulyatorda işləyir. Flutter kernel fayllarını USB (adb forward) və ya Wi-Fi vasitəsilə cihaza ötürür. React Native metro bundler vasitəsilə WebSocket-dən istifadə edir. Fiziki cihazda gecikmə adətən emulyatordan 10–30% yüksək olur.

SwiftUI-də Hot Reload varmı?

Xcode Previews (2021-ci ildən) — SwiftUI üçün hot reload analoqudur, lakin məhdudiyyətlərlə: önbaxış ayrıca kompilə edilir, tətbiq üzrə naviqasiyanı və mürəkkəb vəziyyətləri dəstəkləmir. Apple iOS üçün rəsmi hot reload təqdim etmir. Üçüncü tərəf alətləri: InjectionIII və SwiftHotReload kod injeksiyası üçün Objective-C Runtime-dən istifadə edir.

Hot Reload-dan sonra problemləri necə debug etməli?

Əgər hot reload-dan sonra UI düzgün göstərilmirsə: hot restart edin. Problem məlumatlardadırsa — Flutter-də reassemble() callbackini və ya React Native-də useEffect cleanup-i yoxlayın. Davamlı problemlər üçün Flutter Clean və ya Reset Metro Cache istifadə edin. Xəta yalnız reload-dan sonra təkrarlanırsa — bu, dəyişikliklərin mövcud vəziyyətlə uyğunsuzluğunun əlamətidir.

Nəticə

  • Hot Reload — tətbiqi yenidən başlatmadan və vəziyyətini itirmədən kodun inkremental yenilənməsi.
  • Flutter kernel fayllarının yüklənməsi və ClassTable-da funksiyaların dəyişdirilməsi ilə Dart VM JIT-dən istifadə edir.
  • React Native Metro bundler və WebSocket vasitəsilə HMR ilə Fast Refresh tətbiq edir.
  • Hot Reload UI dəyişiklikləri üçün, Hot Restart — struktur dəyişiklikləri və yeni modullar üçün işləyir.
  • Native inkişaf (Android/iOS) məhdud dəstəyə malikdir: Apply Changes və Xcode Previews.
  • Fərq hot reload və hot restart arasında — sürət (0.3–2 san vs 2–10 san) və vəziyyətin qorunması.
  • Hot Reload inkişaf dövrünü 40–60% qısaldır, müasir çərçivələrin məcburi alətidir.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun