• 29.08.2026 09:20:20
  • Admin Admin

Flutter mobil uygulama geliştirme projelerinde Dart derleme, kod üretimi ve Gradle yapılandırma maliyetini ölçün. Tekrarlanabilir benchmark, bağımlılık sınırları ve CI eşikleriyle derleme regresyonlarını yakalayın.

Flutter Mobil Uygulama Geliştirmede Derleme Süresi İzleme Rehberi

Flutter mobil uygulama geliştirmede derleme süresini doğru ölçmek

Derleme süresini 'flutter build apk' komutunun ekrana yazdığı toplam süreyle değerlendirmeyin. Bu sayı Dart ön uç derlemesi, asset paketleme, Gradle configuration, Kotlin/Java derleme ve imzalama maliyetlerini tek değerde birleştirir. Önce aynı makinede hem sıcak hem soğuk derlemeyi ayırın. Sıcak ölçüm, geliştiricinin bir Dart dosyası değiştirdikten sonraki döngüsünü; soğuk ölçüm ise CI worker veya yeni checkout senaryosunu temsil eder. macOS ve Linux üzerinde hyperfine ile en az 5 tekrar alın; disk önbelleğini her tekrar öncesi silmek yalnızca soğuk derleme deneyi için anlamlıdır.

# Sicak derleme: .dart_tool ve Gradle cache korunur.
hyperfine --warmup 1 --runs 5   'flutter build apk --debug'

# Soguk derleme: sadece proje uretim ciktilarini sifirla.
# Global pub ve Gradle cache silinmez; aksi halde ag gecikmesi olcume girer.
hyperfine --runs 5 --prepare 'flutter clean'   'flutter build apk --debug'

Ardından Android tarafındaki maliyeti ayırmak için android dizininde Gradle profil raporu üretin. './gradlew :app:assembleDebug --profile' komutu 'build/reports/profile' altında task sürelerini gösterir. 'compileFlutterBuildDebug' uzunsa Dart/AOT veya asset aşamasına, 'kotlinCompile' uzunsa native eklenti koduna, configuration süresi uzunsa Gradle eklentilerine odaklanın. Değişiklikten önce ve sonra aynı commit, aynı Flutter SDK kanalı, aynı JDK ve aynı bağımlılık kilidiyle alınan medyan süreyi karşılaştırın; tek bir en düşük süreyi raporlamayın.

Dart programlama eğitimi açısından kritik ayrıntı: kütüphane sınırları ve kod üretimi

Dart artımlı derlemesinde dosya değil kütüphane bağımlılık grafiği önemlidir. Özellikle büyük bir 'part' tabanlı feature library'sinde tek bir part dosyasını değiştirmek, o library'nin tamamını yeniden derletir. Ayrıca geniş bir barrel export dosyasına yeni export eklemek, onu import eden tüm library'lerin bağımlılık özetini değiştirebilir. Bu nedenle 'lib/features/orders/orders.dart' gibi her şeyi export eden dosyayı uygulama çapında import etmek yerine, feature içi API dosyalarını dar tutun ve uygulama katmanında doğrudan gereken library'yi import edin.

// Kotu: ortak barrel degistikce cok sayida import eden library etkilenir.
import 'package:app/features/orders/orders.dart';

// Daha dar bagimlilik: sadece gereken API yuzeyi izlenir.
import 'package:app/features/orders/application/order_repository.dart';
import 'package:app/features/orders/domain/order.dart';

Kod üretiminde tam proje üretimi yerine değişiklik kapsamını doğrulayın. build_runner kullanan projelerde önce 'dart run build_runner build --build-filter="lib/features/orders/**"' ile feature düzeyinde üretilen dosyaları kontrol edin; ardından CI'da tam üretim çalıştırın. Bu filtre, özellikle freezed, json_serializable veya riverpod_generator çıktısı olan büyük depolarda yerel geri bildirim süresini düşürür. Ancak filtreyi sadece yerel döngüde kullanın: ortak bir annotation, builder seçeneği veya export değişikliği bağımlı feature'ların çıktısını etkileyebileceği için merge öncesi tam 'dart run build_runner build --delete-conflicting-outputs' zorunlu kalmalıdır.

Bir dart programlama eğitimi içinde sık atlanan hata, üretilen '.g.dart' dosyalarını manuel düzenlemektir. Bu düzenleme bir sonraki generator çalışmasında kaybolur ve farkın gerçek kaynağını belirsizleştirir. Generator maliyetini ayrıca ölçmek için 'time dart run build_runner build --delete-conflicting-outputs' komutunu, yalnızca bir model alanı değiştirildikten sonra ve temiz üretimden sonra çalıştırın. İlk ölçüm generator asset graph oluşturma maliyetini, ikinci ölçüm ise graph cache'in yerel geliştirme döngüsündeki etkisini gösterir.

Flutter state management değişikliklerinin derleme grafiğine etkisi

flutter state management seçimi sadece çalışma zamanı yeniden çizimlerini değil, kaynak bağımlılıklarını da etkiler. Tek bir 'app_providers.dart' dosyasından yüzlerce provider export etmek, o dosyaya yeni provider eklendiğinde geniş bir import yüzeyini etkiler. Riverpod, Provider veya Bloc kullanırken provider tanımlarını feature bazında yerleştirin; presentation katmanı yalnızca kendi feature provider'ını import etsin. Bu yaklaşımın doğrulaması için değişiklik öncesi ve sonrası 'flutter build apk --debug' medyanını ölçün, ayrıca 'dart analyze lib/features/orders' ile feature sınırında istemeden oluşan importları yakalayın.

// lib/features/orders/presentation/orders_providers.dart
final ordersControllerProvider =
    NotifierProvider<OrdersController, OrdersState>(OrdersController.new);

// lib/features/orders/presentation/orders_page.dart
import 'orders_providers.dart';

// Kacinin: import 'package:app/app_providers.dart';

Generated provider kullanan ekiplerde generator sürümü veya build.yaml seçeneği değiştiğinde bütün generated dosyaların yeniden üretilmesi beklenen bir sonuçtur. Bu değişiklikleri ayrı bir pull request'te yapın ve CI loglarında generator adımını uygulama derlemesinden ayrı zamanlayın. Aksi halde bir flutter kursu katılımcısının veya deneyimli bir geliştiricinin gördüğü 'build yavasladi' sinyali, state katmanındaki kaynak grafiğinden mi yoksa Android Gradle eklentisinden mi geldiği anlaşılmayan bir ölçüme dönüşür.

Cross platform mobil uygulama geliştirme için Gradle yapılandırma önbelleği

cross platform mobil uygulama geliştirme projelerinde Android derlemesi çoğu zaman iOS tarafındaki Xcode derlemesinden bağımsız darboğaz oluşturur. Android için önce Gradle raporunda configuration süresini inceleyin. Configuration aşaması task graph kurulmadan önce tüm ilgili plugin ve build script'leri değerlendirir; modül sayısı, eklentilerin eager task yaratması ve dosya sistemi sorguları bu aşamayı uzatır. Uyumlu bir projede aşağıdaki ayarları deneyin, sonra aynı hyperfine komutuyla medyanı önceki ölçümle karşılaştırın.

# android/gradle.properties
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.configuration-cache=true

# Degisiklik sonrasi dogrulama
cd android
./gradlew :app:assembleDebug --configuration-cache --profile

Configuration cache her eklentiyle otomatik uyumlu değildir. Komut çıktısında 'configuration cache problems found' uyarısını bastırmayın; eklentinin proje nesnesine execution zamanında erişmesi, dış process başlatması veya serialize edilemeyen task girdisi kullanması cache kaydını geçersiz kılar. Önce rapordaki problemli task veya plugin'i düzeltin ya da özelliği geri alın. 'org.gradle.caching=true' ise farklı bir mekanizmadır: task input hash'i aynıysa önceki output'u kullanır. İki ayarı aynı performans tekniği gibi değerlendirmek, regresyonun nedenini yanlış sınıflandırır.

CI içinde derleme regresyonu eşiği kurmak

Ölçümü kişisel bilgisayarda bırakmayın. CI pipeline'ında bağımlılıkların sabitlenmesi için 'flutter pub get --enforce-lockfile' kullanın ve derleme sürelerini artifact olarak saklayın. Paylaşımlı CI runner'larında mutlak süre gürültülüdür; bu nedenle aynı pipeline içinde bir baz commit ve aday commit derlemesini mümkünse aynı runner tipinde çalıştırın veya son 20 başarılı build'in medyanına göre yüzde eşiği kullanın. Örneğin debug APK sıcak derleme medyanı yüzde 15'ten fazla artarsa raporu başarısız kılacak bir kontrol ekleyin.

#!/usr/bin/env bash
set -euo pipefail
baseline_ms=84000
candidate_ms=$(hyperfine --warmup 1 --runs 3   --export-json build-benchmark.json   'flutter build apk --debug'   | awk '/Mean/ { gsub(/ms/, "", $2); print int($2); exit }')

limit_ms=$((baseline_ms * 115 / 100))
test "$candidate_ms" -le "$limit_ms" || {
  echo "Build regression: ${candidate_ms}ms > ${limit_ms}ms"
  exit 1
}

Bu scriptteki edge case, hyperfine metin çıktısının sürüm veya locale ile değişebilmesidir. Üretimde stdout parse etmek yerine '--export-json build-benchmark.json' dosyasındaki 'results[0].mean' alanını jq ile milisaniyeye çevirin. Ayrıca benchmark'tan önce log, analytics veya ağ indirmesi yapan adımları ayırın. flutter eğitimi materyalinde bu ayrım önemlidir: pub cache miss nedeniyle uzayan bir iş, Dart derleyicisinin yavaşladığını göstermez; bağımlılık çözümleme ve artifact indirme maliyetini gösterir.

İlgili Eğitim

Flutter Eğitimi

Sık Sorulan Sorular

Flutter mobil uygulama geliştirmede derleme suresi neden her makinede farkli cikar?

CPU frekansi, disk IOPS, JDK, Gradle daemon durumu ve cache hit orani sonucu degistirir. Karsilastirma icin ayni runner image'ini kullanin, 'flutter --version', 'java -version' ve 'flutter pub deps --style=compact' ciktisini build artifact'ine ekleyin. Sicak ve soguk derlemeyi ayri benchmark olarak raporlayin.

Flutter state management yapisi derleme suresini nasil etkiler?

State yonetim kutuphanesinden cok import grafiginin genisligi etkilidir. Ortak bir provider barrel dosyasini her feature'a import etmek, o dosyadaki degisiklikte cok sayida library'nin yeniden derlenmesine yol acar. Feature bazli provider dosyalari kullanin, sonra bir provider ekleyip once-sonra 'hyperfine --runs 5 flutter build apk --debug' medyanini olcun.

Dart programlama egitimi projelerinde build_runner ne zaman tam calistirilmalidir?

Yerelde ' --build-filter' ile degisen feature'in uretimini hizlandirabilirsiniz. Ancak annotation, build.yaml, ortak model veya generator surumu degistiginde tam 'dart run build_runner build --delete-conflicting-outputs' calistirin. CI'da tam uretimden sonra 'git diff --exit-code' kullanarak commit edilmemis generated dosya kalmadigini kontrol edin.

Flutter kursu icin Gradle configuration cache acmak guvenli mi?

Kosulsuz olarak degil. 'cd android && ./gradlew :app:assembleDebug --configuration-cache --profile' ile once plugin uyumlulugunu test edin. Rapor serialize edilemeyen task girdisi veya execution zamaninda Project erisimi gosteriyorsa uyarilari ignore etmeyin; ilgili plugin ayarini duzeltin ya da configuration cache'i devre disi birakin.

AI / LLM Discovery

Bu makale Opendart Akademi Flutter eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.

Opendart Akademi llms.txt