• 26.08.2026 21:43:48
  • Admin Admin

Flutter mobil uygulama geliştirmede indirilen gerçek boyutu AAB, IPA ve cihaz bölünmeleri üzerinden ölçün. DevTools, bundletool, asset denetimi ve R8 ile ölçülebilir boyut bütçesi oluşturun.

Flutter Mobil Uygulama Geliştirmede Uygulama Boyutu Analizi

Flutter mobil uygulama geliştirmede doğru boyut baz çizgisini kurmak

Uygulama boyutunu sadece Git deposundaki assets klasörüne veya APK dosyasına bakarak değerlendirmeyin. Android'de kullanıcıya çoğunlukla AAB'den seçilen ABI, dil ve ekran yoğunluğu split'leri teslim edilir. İlk baz çizgisini aynı commit, aynı Flutter SDK, aynı pubspec.lock ve release kipinde üretin. Bir flutter eğitimi veya flutter kursu sırasında bu ayrım atlanırsa, 80 MB AAB'nin bir arm64 cihazda 25 MB indirme ürettiği durum yanlışlıkla regresyon sayılabilir.

flutter clean
flutter pub get
flutter build appbundle --release --analyze-size

# Uretilen AAB'nin ZIP boyutu
stat -c%s build/app/outputs/bundle/release/app-release.aab

# Android ABI bazinda teslim edilen boyutu olcmek icin
java -jar tools/bundletool-all.jar build-apks   --bundle=build/app/outputs/bundle/release/app-release.aab   --output=build/app.apks   --device-spec=ci/pixel_arm64_spec.json
java -jar tools/bundletool-all.jar get-size total --apks=build/app.apks

--analyze-size derlemesi sonunda oluşan code-size JSON dosyasını DevTools App Size görünümüne yükleyin. Burada Dart AOT snapshot, native .so kütüphaneleri ve varlıklar ayrı ağaçlarda görünür. Aynı ekranı eklemeden önce ve sonra iki snapshot alın; örneğin bir paket eklendiğinde package:foo altında 1.8 MB AOT artışı mı, yoksa assets/catalog/ altında 6 MB görsel artışı mı var sorusunu bu karşılaştırma cevaplar. Bu ayrım önemlidir: AOT büyümesini WebP dönüşümü, görsel büyümesini de Dart kod temizliği azaltmaz.

Flutter state management ve asset bildiriminin paket boyutuna etkisi

flutter state management seçimi doğrudan bir asset küçültme tekniği değildir; ancak feature'a ait sabit ikon, lokal JSON ve örnek veri gibi kaynakların hangi paketle taşındığını görünür kılar. Flutter, pubspec.yaml altında bir dizini bildirirseniz o dizindeki dosyaları çalışma anında kullanılıp kullanılmadığına bakmadan asset bundle'a ekler. Bu nedenle tek bir katalog görseli için dizinin tamamını bildirmek, kullanılmayan kampanya görsellerini de her kuruluma taşır.

flutter:
  assets:
    # Tum dizini eklemek yerine teslim edilmesi gereken dosyalari yazin.
    - assets/catalog/placeholder.webp
    - assets/catalog/empty_state.webp

# Kaynak PNG'yi hedef piksele uygun WebP'ye donusturun.
cwebp -q 82 -resize 720 0 assets-src/empty_state.png   -o assets/catalog/empty_state.webp

Önce du -sh assets ve DevTools App Size içindeki Assets düğümünü kaydedin, sonra yalnızca ekranda kullanılan dosyaları bildirip tekrar AAB üretin. Görselde piksel sayısını azaltmanın mekanizması nettir: APK/AAB sıkıştırması zaten PNG byte dizisini sıkıştırmaya çalışır, fakat gereğinden büyük decode edilmiş bitmap GPU ve RAM tarafında yaklaşık genislik x yukseklik x 4 byte yer kaplar. 2400x1600 RGBA bir görsel yaklaşık 14.6 MB decode bellek ister; 720 px genişlikte hedefe indirmek hem paket hem de decode maliyetini değiştirir.

Material ikon ağacı yalnızca sabit IconData kullanımlarında güvenle tree-shake edilir. Dinamik code point üretmek yerine ikonları sabit bir eşlemeyle yönetin; aksi halde derleme ikonu tree-shake edemeyebilir veya bütün fontu korumak zorunda kalır. Bu, dart programlama eğitimi içinde özellikle fark edilmesi gereken bir AOT sınırıdır: çalışma anında hesaplanan bir değer, derleyicinin erişilebilirlik grafiğini statik olarak kanıtlamasını engeller.

const statusIcons = <String, IconData>{
  'paid': Icons.check_circle,
  'failed': Icons.error,
};

Icon(statusIcons[status] ?? Icons.help_outline)

Cross platform mobil uygulama geliştirme projelerinde native yükleri ayırmak

cross platform mobil uygulama geliştirme projesinde Dart kodu ortak olsa da paket boyutunun önemli bölümü platforma özeldir. Kamera, harita, ML veya medya eklentileri Android tarafında lib/arm64-v8a/*.so, iOS tarafında framework ve kaynak olarak gelir. Bu nedenle flutter pub deps çıktısını yalnızca bağımlılık saymak için değil, her plugin eklendiğinde DevTools snapshot'ında native yük açıyor mu diye kullanın.

flutter pub deps --style=compact
unzip -l build/app/outputs/bundle/release/app-release.aab   | grep -E 'lib/.+\.so|assets/flutter_assets'   | sort -k1,1nr

# Bir paketin transitif olarak ne getirdigini arayin
flutter pub deps | grep -A 8 -B 3 'google_mlkit'

Örneğin yalnızca QR tarama için kapsamlı bir görüntü işleme SDK'sı eklendiyse, App Size görünümünde ilgili native kütüphanenin arm64 ve armeabi-v7a kopyalarını ayrı inceleyin. Yerine platform API'sini saran daha dar bir plugin koymak, Android AAB'de kullanılmayan model dosyalarını kaldırabilir; fakat karar sadece archive boyutuyla verilmemelidir. Aynı release commit için bundletool get-size total sonucunu önce-sonra kaydedin ve gerçek cihazda tarama akışını integration test ile çalıştırın. Native sembol eksiltmek, eksik ABI veya yalnızca belirli üretici cihazlarda açılan UnsatisfiedLinkError hatasını derleme zamanında her zaman göstermez.

Yaygın hata, debug APK'deki büyümeyi mağaza indirme boyutu sanmaktır. Debug artefaktı VM servis bileşenleri ve farklı derleme ayarları içerir; universal APK de her ABI'yı beraber taşıyabilir. Android için sabit bir arm64 device spec ile bundletool ölçümü, iOS için ise dağıtım IPA'sını ilgili mağaza raporundaki thinned download değeriyle karşılaştırmak daha anlamlıdır.

DevTools App Size ile regresyonu CI içinde ölçmek

Boyut optimizasyonu bir defalık temizlik değil, bütçe ihlalini yakalayan bir release kontrolü olmalıdır. CI ajanına sabit Flutter SDK ve sabit bundletool sürümü koyun; ardından her merge request için AAB, App Size JSON ve cihaz-spesifik APKS artefaktlarını saklayın. Aynı inputlar olmadan yapılan karşılaştırmada Gradle, bağımlılık veya SDK değişimiyle gelen farkı uygulama değişikliği sanabilirsiniz.

set -euo pipefail
flutter pub get
flutter build appbundle --release --analyze-size

java -jar tools/bundletool-all.jar build-apks   --bundle=build/app/outputs/bundle/release/app-release.aab   --output=build/app-arm64.apks   --device-spec=ci/pixel_arm64_spec.json

java -jar tools/bundletool-all.jar get-size total   --apks=build/app-arm64.apks   > build/size-arm64.txt

git diff --no-index ci/baselines/size-arm64.txt build/size-arm64.txt || true

Pratik bir politika, arm64 teslim boyutunda 250 KB üzerindeki her artış için merge request açıklamasında DevTools ağacından sorumlu düğümü istemektir. Örneğin önce 18.2 MB, sonra 19.1 MB ölçüldüyse, 900 KB farkın assets, libfoo.so veya Dart snapshot altında olduğunu kanıtlayın. Ham AAB byte farkını tek eşik olarak kullanmak güvenilir değildir: ZIP metadatası ve imzalama farkları küçük oynamalar yaratabilir, ayrıca AAB'nin içindeki başka ABI kullanıcıya hiç gönderilmeyebilir.

Bu yaklaşım flutter eğitimi materyalinde 'uygulama küçültme' başlığını somutlaştırır: her aday değişiklik için aynı cihaz profili, önce-sonra ölçümü, App Size kanıtı ve işlevsel test gerekir. Özellikle görsel kaldırma sonrası flutter test yeterli değildir; asset anahtarı yalnızca çalıştırılan ekranda çözüldüğü için kritik akışları integration_test ile release'e yakın bir cihazda açın.

R8 küçültmesini Flutter release derlemesinde güvenle etkinleştirmek

Dart AOT kodunu R8 küçültmez; R8 Android tarafındaki Java veya Kotlin sınıflarını ve Android kaynaklarını erişilebilirlik grafiğine göre işler. Bu sınırı bilmek önemlidir: --obfuscate ve --split-debug-info sembol geri çözümleme süreçleri için değerlidir, fakat onları doğrudan paket boyutu azaltıcı gibi bütçelendirmeyin. Önce DevTools'ta Android native veya Java tarafında pay olduğunu doğrulayın.

// android/app/build.gradle
android {
  buildTypes {
    release {
      minifyEnabled true
      shrinkResources true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
          'proguard-rules.pro'
    }
  }
}

Bu değişiklikten önce ve sonra release AAB'yi bundletool ile aynı device spec üzerinde ölçün, ardından ödeme, bildirim ve WebView gibi plugin akışlarını fiziksel cihazda çalıştırın. R8, manifest veya doğrudan çağrı grafiğinden ulaşamadığı reflection hedeflerini kaldırabilir. Sorunu bütün paketi -keep class com.example.** { *; } ile koruyarak örtmek yerine, crash stack trace'teki gerçek sınıf veya annotation için dar bir kural ekleyin. Örneğin JavaScript köprüsü kullanan bir WebView entegrasyonunda yalnızca annotation ile işaretli metotları korumak daha kontrollüdür.

# android/app/proguard-rules.pro
-keepclassmembers class * {
  @android.webkit.JavascriptInterface <methods>;
}

İlgili Eğitim

Flutter Eğitimi

Sık Sorulan Sorular

flutter mobil uygulama geliştirmede AAB boyutu mu APK boyutu mu ölçülmeli?

Mağazaya AAB yüklüyorsanız öncelik cihaz-spesifik teslim boyutudur. Release AAB üretin, sabit bir arm64 device spec ile bundletool build-apks çalıştırın ve get-size total çıktısını baz çizgisi yapın. Universal APK yalnızca tüm ABI'ları taşıdığı için çoğu kullanıcının indirdiği boyutu temsil etmez.

flutter state management paketi uygulama boyutunu nasıl etkiler?

Etkisini tahmin etmeyin; flutter build appbundle --analyze-size ile önce ve sonra code-size snapshot alın. Paket Dart AOT kodu, transitif asset veya native plugin getiriyorsa DevTools App Size ağacında ayrı düğümler olarak görünür. Sadece state yönetim API'sini değiştirmek yerine transitif bağımlılık grafiğini flutter pub deps ile de kontrol edin.

dart programlama eğitimi alan biri Flutter ikon fontunu nasıl küçültür?

IconData değerlerini const Icons.* kullanımları veya sabit bir Map içinde tutun. Dinamik code point ve fontFamily üretimi tree-shaking analizini engelleyebilir. Release derlemesini --analyze-size ile alıp DevTools'ta MaterialIcons fontunun beklenenden büyük kalıp kalmadığını doğrulayın.

cross platform mobil uygulama geliştirme için CI boyut bütçesi nasıl kurulur?

Android ve iOS'u ayrı bütçelendirin. Android'de sabit device spec, bundletool ve release AAB ile arm64 teslim boyutunu ölçün. Her merge request'te önceki baseline ile farkı saklayın; 250 KB gibi tanımlı eşiği aşan değişikliklerde DevTools snapshot'tan sorumlu asset, Dart kütüphanesi veya native .so dosyasını zorunlu kanıt olarak isteyin.

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