Mobil Uygulamalar için Hot Reload: Nedir, Çalışma Prensibi ve Mekanizmaları

Yazar: IT Sectr Yayınlanma: 2026-05-17 Okuma süresi: 10 dk

Hot Reload — çalışan bir mobil uygulamanın kodunu yeniden başlatmadan ve mevcut durumu kaybetmeden güncellemeye olanak tanıyan bir teknoloji. Geliştirici kaynak kodu değiştirir — bir saniye içinde değişiklikler cihaz veya emülatör ekranında görünür. Bu, Flutter ve React Native'in temel bir özelliğidir ve geliştirme yinelemelerini kökten hızlandırır: düzenleme-görüntüleme döngü süresi 5–10 saniyeden (yeniden derleme) 300–500 milisaniyeye düşer. Flutter Documentation, 2025'e göre, hot reload değiştirilen kodun artımlı derlemesini yapar ve güncellemeyi Dart VM'ye gönderir.

Önemli Noktalar

  • Hot Reload — uygulamayı yeniden başlatmadan kod güncellemesi, mevcut ekran durumunu korur.
  • Dart VM Flutter'da JIT derlemesi ve fonksiyonların sıcak yamasını (hot patching) kullanır.
  • React Native Metro bundler aracılığıyla JavaScript modül enjeksiyonu ile Fast Refresh uygular.
  • Hot Restart — uyumsuz değişiklikler için kullanılan, durum kaybıyla tam uygulama yeniden yüklemesi.
  • Stateful hot reload değişiklikler yapıyı bozmazsa widget durumunu, değişkenleri ve navigasyonu korur.

Hot Reload Nedir?

Hot Reload, kaynak kodun değiştirildiği ve durdurulmadan çalışan bir uygulamaya uygulandığı bir geliştirme mekanizmasıdır. Geliştirici bir dosyayı düzenler, kaydeder ve 0.3–2 saniye içinde güncellenmiş arayüz ekranda belirir. Uygulama durumu (sayaçlar, kaydırma konumu, girilen veriler) korunur — geliştirici bağlamı kaybetmez.

Hot reload kavramı ilk web araçlarında (LiveReload, 2010) ortaya çıkmış ve Flutter (2017) ve React Native (2015) tarafından mobil geliştirmeye uyarlanmıştır. Günümüzde hot reload, hata ayıklama yapılandırması ve profillemenin yanı sıra modern mobil çerçevelerin zorunlu bir özelliğidir. Hot reload olmadan UI geliştirme verimsiz kabul edilir: her değişiklik incelemesi 10–30 saniyelik yeniden derleme ve başlatma gerektirir.

Teknik olarak hot reload üç adımdan oluşur: değişiklik algılama (dosya izleyici), değiştirilen kodun derlenmesi (artımlı derleyici) ve uygulama (sıcak yama). Her çerçeve bu adımları farklı şekilde uygular, ancak sonuç aynıdır: düzenleme ve görüntüleme arasında minimum gecikme.

Flutter'da Hot Reload Nasıl Çalışır

Flutter'da Hot Reload, Dart VM mimarisi ve JIT derlemesi üzerine inşa edilmiştir. Geliştirici IDE'de “Hot Reload” düğmesine bastığında veya bir dosyayı kaydettiğinde, Flutter değiştirilen Dart kütüphanelerinin çekirdek dosyalarına (.dill) artımlı derlemesini yapar. Dart VM bu dosyaları yükler ve çalışan uygulamadaki değiştirilen fonksiyonların uygulamalarını değiştirir.

dart
// Hot reload sırasında durumu korunan Flutter stateful widget
class CounterWidget extends StatefulWidget {
    @override
    State createState() => _CounterState();
}

class _CounterState extends State {
    int _counter = 0;

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

Örnekte, StatefulWidget CounterWidget, hot reload sırasında _counter alanını korur. Dart VM, reassemble() çağrısı yaparak durumu (State) yeniden oluşturur, ancak _counter'ı sıfırlamaz — widget tamamen yeniden oluşturulmadıkça değer korunur. Flutter tüm State nesneleri için reassemble() çağrısı yapar ve build() güncellenmiş kod ve korunan durumla yeniden çalıştırılır.

Hot reload ne zaman çalışmaz: statik bir başlatma değişkeni (static const), global değişken, main(), enum/mixin sınıf bildirimi veya @override initState() içindeki kod değiştirilmişse. Bu durumlarda Hot Restart gerekir. Flutter Team (2025)'e göre, hot reload vakaların %85–90'ında başarılıdır; değişikliklerin %10–15'i tam yeniden başlatma gerektirir.

Dart VM JIT ve Çekirdek Dosyaları

Dart VM hata ayıklama modunda bir JIT derleyici olarak çalışır: Dart kodunu çekirdek formatı (bayt koduna benzer) aracılığıyla yorumlar. Hot reload yeni bir çekirdek dosyası yükler ve eski fonksiyon tanımlarını değiştirir. VM, isolate'leri yeniden başlatmaz — tüm asenkron işlemler (Future, Stream) çalışmaya devam eder. Sürüm modunda Dart AOT (dart2native) ile derlenir ve hot reload kullanılamaz.

React Native'de Fast Refresh Nasıl Çalışır

Fast Refresh (önceden Hot Reloading) React Native'de Metro bundler kullanır — dosya değişikliklerini izleyen bir JavaScript modül paketleyicisidir. Geliştirici bir dosyayı kaydettiğinde, Metro yalnızca değiştirilen modülü (HMR — Hot Module Replacement) derler ve WebSocket aracılığıyla çalışan uygulamaya güncellemeyi gönderir.

js
// Hot reload sırasında durumu koruyan React Native bileşeni
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';

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

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

Fast Refresh, modül güncellenirken React durumunu (useState, useReducer) korur. Metro HMR yalnızca değiştirilen modülün farkını (diff) iletir — tüm paketi değil. React Native, React ekibi (Dan Abramov, 2019) tarafından geliştirilen React Fast Refresh'i kullanır: bileşen için yeni bir render oluşturur ancak bileşen imzası değişmediyse hook durumlarını ve props'ları korur.

Fast Refresh şu değişikliklerde çalışmaz: bileşen dışa aktarımı, hook'lar (useEffect, useMemo), modül bağımlılıkları ve yerel modüller (Java/Objective-C). Bu tür değişiklikler Reload (tam JS paketi yeniden yükleme) veya Rebuild (yerel kod yeniden derleme) gerektirir. Fast refresh süresi — 200–800 ms, tam reload — 2–5 saniye.

Hot Reload vs Hot Restart: Karşılaştırma

Hot Reload ve Hot Restart, farklı kullanım senaryolarına sahip iki kod güncelleme modudur. Hot Reload, sınıf yapısı ve durum türü değişmediğinde UI değişiklikleri (stiller, düzen, renkler, metinler) için uygundur. Hot Restart, metot imzalarının değiştirilmesi, kök ağaca yeni widget/bileşen eklenmesi, initState ve yerel modüllerin değiştirilmesi durumunda gereklidir.

ÖzellikHot ReloadHot Restart
Hız0.3–2 saniye2–10 saniye
Durum korumaEvet (değişkenler, state, navigasyon yığını)Hayır (uygulama yeniden başlar)
DerlemeArtımlı (sadece değişiklikler)Tam Dart/JS yeniden derleme
Ne zaman kullanılırUI ayarlamaları, stiller, metinler, düzenYapısal değişiklikler, yeni modüller, yerel kod
FlutterHot Reload (R)Hot Restart (Shift + R)
React NativeFast RefreshReload (Cmd + R)

Önerilen strateji: hot reload ile başlayın. Değişiklikler uygulanmazsa (IDE “Reload needed” gösteriyorsa) — hot restart yapın. Flutter'da buton simgesi değişir: şimşek (⚡) hot reload için, üstü çizili şimşek restart gerekiyorsa. Tam yeniden derlemelere kıyasla hot reload ile geliştirme verimliliği %40–60 daha yüksektir (JetBrains Developer Survey 2024 verileri).

Uygulama Mekanizmaları: Kod Enjeksiyonu ve Sıcak Yama

Kod enjeksiyonu (code injection), tüm çerçeveler tarafından kullanılan hot reload'in genel mekanizmasıdır. Üç aşamadan oluşur. Birinci — değişiklik algılama: bir dosya izleyici (IDE'ye entegre) veya dosya sistemi (FSNotify) .dart, .js, .tsx dosyasındaki değişikliği algılar. İkinci — derleme: artımlı derleyici yalnızca değiştirilen dosyayı bir ara temsile (Dart için çekirdek .dill, JS için HMR modülü) dönüştürür. Üçüncü — uygulama: yeni kod cihaza gönderilir ve çalışan uygulamanın belleğindeki eski tanımları değiştirir.

Sıcak fonksiyon değiştirme (hot patching), çalışma zamanının sanal metot tablosundaki fonksiyon işaretçisini değiştirdiği bir tekniktir. Dart VM, ClassTable — yüklenen tüm sınıfları içeren iç yapıyı kullanır. Hot reload sırasında VM, ClassTable'da sınıfı bulur ve fonksiyon tanımlarını çekirdek dosyasındaki yenileriyle değiştirir. Mevcut tüm sınıf örnekleri otomatik olarak yeni davranışı alır.

dart
// Flutter: hot reload sonrası durum yönetimi için reassemble geri çağrısı
class MyWidget extends StatefulWidget {
    @override
    State createState() => _MyState();
}

mixin ReloadAware on State {
    @override
    void reassemble() {
        super.reassemble();
        // Hot reload sonrası önbelleği veya verileri sıfırla
        clearCache();
    }
}

Örnekte, ReloadAware mixin'i, Dart VM'nin hot reload'den sonra her State nesnesinde çağırdığı reassemble() metodunu geçersiz kılar. Geliştirici önbelleği sıfırlayabilir, kaynakları yeniden başlatabilir veya durum geçişi gerçekleştirebilir. Bu metot olmadan, eski veriler önbellekte kalabilir ve widget güncellemelerinden sonra tutarsızlığa neden olabilir.

Sıcak Yamanın Sınırlamaları

Sıcak yama, yeni alanlar için bellek yeniden tahsisi, bir sınıfta değişken türünün değiştirilmesi, StatefulWidget'a yeni alanlar eklenmesi, enum değerlerinin veya genel parametrelerin değiştirilmesini gerektiren değişiklikler için çalışmaz. Bu değişiklikler bellektekimevcut nesnelerle uyumsuzdur — Dart VM önceden tahsis edilmiş nesnelerdeki alanları “karıştıramaz”. Bu gibi durumlarda, hot restart veya tam yeniden derleme gerekir.

Yerel Geliştirmede Hot Reload: Android ve iOS

Yerel Android ve iOS geliştirmesi geleneksel olarak tam hot reload'e sahip değildir. Android Studio, Android 11+ ve AGP 4.2+ ile Apply Changes'i destekler: uygulamayı yeniden başlatmadan kod güncellemesi. Apply Changes, Android Runtime (ART) aracılığıyla çalışır — anında dex dosyalarındaki metot uygulamalarını değiştirir. Ancak Apply Changes sınırlıdır: kaynak değişiklikleri (layout.xml, drawable), manifest ve yerel kütüphaneler için çalışmaz.

Apple, Xcode 15'te (2023) Previews'i (SwiftUI Preview) tanıttı — bu klasik anlamda hot reload değildir. Previews, önizleme bölümünü ana uygulamadan ayrı olarak derler ve sonucu Xcode tuvalinde gösterir. Bir dosya kaydedildiğinde, önizleme 1–3 saniyede güncellenir, ancak uygulama durumu korunmaz. UIKit projeleri için hot reload, üçüncü taraf araçlar aracılığıyla kullanılabilir: InjectionIII (John Holdsworth) ve SwiftHotReload.

Kotlin Multiplatform (KMP), 2024'ten itibaren JetBrains'ten deneysel hot reload desteği aldı. Mekanizma, nesne dosyasındaki (.klib) fonksiyon değiştirme ile Kotlin/Native runtime'a dayanır. JetBrains Compose Multiplayer, Flutter'a benzer kendi hot reload uygulamasını kullanır: Kotlin/Native runtime'da artımlı derleme ve sınıf değiştirme. Hız — 1–3 saniye, yalnızca UI değişiklikleri için kullanılabilir.

Android Studio'da Apply Changes: Nasıl Çalışır

Apply Changes, ART runtime API'sini kullanan bir Android Studio mekanizmasıdır. Kod kaydedildiğinde, Android Studio hangi sınıfların değiştiğini belirler ve adb aracılığıyla bunların dex dosyalarını cihaza gönderir. ART, durdurmadan çalışan uygulamadaki metot uygulamalarını değiştirir. Apply Changes üç modda çalışır: Instant Run (hızlı metot değiştirme), Swap (örnek yeniden oluşturma ile sınıf değiştirme) ve Restart Activity (değişiklikler mevcut durumla uyumsuzsa).

Sıkça Sorulan Sorular

Hot Reload, Live Reload'dan nasıl farklıdır?

Hot Reload uygulamayı yeniden başlatmadan kodu günceller ve durumu korur. Live Reload, dosyalar değiştiğinde tüm uygulamayı veya web sayfasını yeniden yükler. Live Reload uygulaması daha basittir ancak daha yavaştır ve durumu kaybeder. Flutter ve React Native hot reload kullanır; web araçları live reload kullanır.

Hot Reload neden her zaman çalışmaz?

Hot Reload, bellek yeniden tahsisi gerektiren değişiklikler (yeni sınıf alanları), statik sabitlerin (static const) değiştirilmesi, widget'ların yeniden adlandırılması, enum veya genel parametrelerin değiştirilmesi durumunda çalışmaz. Bu değişiklikler, Dart VM veya JavaScript runtime belleğindeki mevcut nesnelerle uyumsuzdur.

Hot Reload fiziksel bir cihazda çalışır mı?

Evet, hot reload hem fiziksel cihazlarda hem de emülatörlerde çalışır. Flutter çekirdek dosyalarını USB (adb forward) veya Wi-Fi aracılığıyla cihaza gönderir. React Native, Metro bundler aracılığıyla WebSocket kullanır. Fiziksel cihazdaki gecikme genellikle emülatöre göre %10–30 daha yüksektir.

SwiftUI'da Hot Reload var mı?

Xcode Previews (2021'den beri) SwiftUI için hot reload'in bir benzeridir, ancak sınırlamalarla: önizlemeler ayrı olarak derlenir, uygulama navigasyonunu ve karmaşık durumları desteklemez. Apple iOS için resmi hot reload sağlamamaktadır. Üçüncü taraf araçlar: InjectionIII ve SwiftHotReload, kod enjeksiyonu için Objective-C Runtime kullanır.

Hot Reload sonrası sorunlar nasıl hata ayıklanır?

Hot reload sonrası UI yanlış görüntüleniyorsa: hot restart yapın. Sorun verilerdeyse — Flutter'da reassemble() geri çağrısını veya React Native'de useEffect cleanup'i kontrol edin. Kalıcı sorunlar için Flutter Clean veya Reset Metro Cache kullanın. Bir hata yalnızca reload sonrasında tekrarlanıyorsa — bu, değişikliklerin mevcut durumla uyumsuzluğunun bir işaretidir.

Özet

  • Hot Reload — uygulamayı yeniden başlatmadan ve durumu kaybetmeden artımlı kod güncellemesi.
  • Flutter çekirdek dosyası yükleme ve ClassTable'da fonksiyon değiştirme ile Dart VM JIT kullanır.
  • React Native Metro bundler ve WebSocket aracılığıyla HMR ile Fast Refresh uygular.
  • Hot Reload UI değişiklikleri için çalışır; Hot Restart yapısal değişiklikler ve yeni modüller için.
  • Yerel geliştirme (Android/iOS) sınırlı desteğe sahiptir: Apply Changes ve Xcode Previews.
  • Fark hot reload ve hot restart arasında hız (0.3–2 sn vs 2–10 sn) ve durum korumadır.
  • Hot reload geliştirme döngüsünü %40–60 oranında azaltır, modern çerçeveler için temel bir araçtır.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun