Flutter mobil uygulama geliştirme sürecinde ikili boyutunu ölçmeyi, Dart AOT erişilebilirlik ağacını incelemeyi, R8 sınırlarını ayırmayı ve CI üzerinde boyut bütçesi uygulamayı öğrenin. Bu yaklaşım flutter eğitimi projelerinde somut sonuç üretir.
Flutter Mobil Uygulama Geliştirmede APK Boyutu ve Sembol Analizi
Flutter mobil uygulama geliştirmede ölçülebilir boyut tabanı kurmak
Boyut azaltma çalışmasına debug APK ile başlamayın. Debug derlemesi Dart VM snapshot'ları, geliştirme servisleri ve farklı derleme bayrakları içerir. Hedef cihaz mimarisi için release çıktısını ölçün; örneğin arm64 cihaz filosu için her değişiklik öncesinde ve sonrasında aynı komutu çalıştırın.
rm -rf build/size-baseline
flutter build apk --release --target-platform android-arm64 --analyze-size --split-debug-info=build/size-baseline
ls -lh build/app/outputs/flutter-apk/
--analyze-size, Dart AOT snapshot'ı, native kütüphaneler ve asset paketini bileşen bazında ayırır. Aynı karşılaştırmada biri universal APK, diğeri ABI'ye ayrılmış APK olursa sonuç geçersizdir; paketleme stratejisini sabitleyin.Flutter DevTools içindeki App Size ekranında önce en büyük üç düğümü kaydedin: genellikle libapp.so içindeki Dart kodu, assets/ altında bildirilen medya ve Android tarafındaki native .so dosyalarıdır. Değişiklikten sonra toplam APK yerine aynı düğümün delta değerini kıyaslayın. Örneğin 4 MB düşüşün yalnızca x86 emülatör kütüphanesinin çıkarılmasından geldiğini, arm64 üretim çıktısının ise değişmediğini bu ağaçta hemen görürsünüz. Bu ölçüm disiplini, flutter kursu kapsamında yapılan 'paketi küçülttüm' iddiasını tekrar üretilebilir bir deneye dönüştürür.
Dart programlama eğitimi açısından AOT erişilebilirlik ve tree shaking
Release modunda Dart derleyicisi, giriş noktalarından erişilebilen kodu AOT snapshot'ına alır. Ancak çalışma anında hesaplanan koşullar, import edilen büyük bir paketin API yüzeyini erişilebilir tutabilir. Üretimde kapalı olan geliştirme araçlarını const derleme zamanı bayrağı ile ayırın; String tabanlı bir remote config veya SharedPreferences değeri ile yapılan if kontrolü, derleme zamanında kodu budamaya izin vermez.
const enableNetworkInspector = bool.fromEnvironment(
'ENABLE_NETWORK_INSPECTOR',
defaultValue: false,
);
Widget buildDiagnostics() {
if (enableNetworkInspector) {
return const NetworkInspectorPanel();
}
return const SizedBox.shrink();
}
Varsayılan release derlemesinde bu sabit false olduğunda derleyici erişilemeyen dalı ve yalnızca o daldan ulaşılan sınıfları çıkarabilir. İnce ayrıntı şudur: NetworkInspectorPanel başka bir üretim widget'ı tarafından referanslanıyorsa bu teknik paketi küçültmez; DevTools ağaç görünümünde referans zincirini doğrulayın.flutter state management katmanında gereksiz erişilebilirlik sık görülür. Tek bir global provider kaydı içinde debug observer, JSON inspector veya nadir kullanılan feature modülünü doğrudan oluşturmak, o sınıfları uygulamanın kökünden erişilebilir yapar. Kayıtları derleme zamanı bayrağıyla ayırın ve statik import zincirini inceleyin.
final providers = <ProviderOverride>[
apiClientProvider.overrideWithValue(ApiClient()),
if (enableNetworkInspector)
observerProvider.overrideWithValue(NetworkObserver()),
];
Bu örnekte Riverpod kullanılıyor, ancak aynı risk Bloc observer ve GetIt singleton kayıtlarında da vardır. dart programlama eğitimi sırasında öğretilen import kavramının ikili boyuta etkisi tam olarak burada görünür: import tek başına her zaman boyut eklemez, fakat kökten yapılan somut oluşturma erişilebilirlik grafiğini genişletir.Flutter mobil uygulama geliştirmede R8, semboller ve ABI ayrımı
Dart kodu için tree shaking ile Android tarafındaki R8 küçültmesini birbirine karıştırmayın. R8, Java/Kotlin bytecode ve Android kaynakları üzerinde çalışır; Dart AOT kodunu küçültmez. Android eklentilerinin Java tarafında kullanılmayan sınıflar varsa release yapılandırmasında R8'i etkinleştirin, ardından cihaz üzerinde kamera, bildirim, deep link ve arka plan worker akışlarını test edin. Reflection, JNI ve manifest ile çağrılan sınıflar statik çağrı grafiğinde görünmeyebilir.
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
}
R8 sonrası oluşan mapping.txt dosyasını CI artefaktı olarak saklayın. Crash raporundaki obfuscate edilmiş Android stack trace'i bu dosya olmadan geri çevrilemez.Dağıtımda AAB kullanıyorsanız mağaza kullanıcıya ABI'ye uygun split APK verir; yerel testte universal APK ölçmek bu nedenle yanıltıcı derecede büyük olabilir. Gerçek dağıtım boyutunu bundletool ile hedef cihaz özelliklerine göre hesaplayın.
flutter build appbundle --release --obfuscate --split-debug-info=build/symbols
bundletool build-apks --bundle=build/app/outputs/bundle/release/app-release.aab --output=build/app.apks --mode=default
bundletool get-size total --apks=build/app.apks --device-spec=device-spec.json
Flutter'ın --obfuscate seçeneği isimleri değiştirir, boyutu garantili biçimde düşürmez. Ayrıca build/symbols dizini Dart stack trace sembol çözümlemesi için gereklidir; Android mapping.txt ile aynı şey değildir. cross platform mobil uygulama geliştirme yapan ekipler iOS için de ayrı IPA ölçümü tutmalıdır, çünkü iOS bitcode, asset catalog ve native bağımlılık dağılımı Android ile eşdeğer değildir.Flutter eğitimi projelerinde asset ve font paket bütçesi
AssetManifest'e giren her dosya paketlenir; uygulama içinde hiç Image.asset çağrılmayan bir PNG'nin pubspec.yaml altında geniş bir klasör bildirimiyle dahil edilmesi sık rastlanan kayıptır. Önce bundle içeriğini dosya boyutuna göre sıralayın, sonra yalnızca kullanılan alt klasörleri bildirin.
# Sorunlu: marketing/ altındaki tüm kaynakları ekler
# assets:
# - assets/marketing/
flutter:
assets:
- assets/marketing/onboarding/
- assets/icons/
Bu değişiklikten önce ve sonra release APK içindeki assets/ dizinini unzip -l ile doğrulayın: unzip -l build/app/outputs/flutter-apk/app-release.apk | sort -k1,1nr | head -30
Dizin bildirimi kaldırıldığında dinamik dosya adıyla erişilen bir asset kırılabilir; asset anahtarlarını integration test içinde açılış ekranı ve nadir rotalar için doğrulamak gerekir.PNG dosyalarında kayıpsız optimizasyon için oxipng, fotoğraflarda WebP dönüşümü için cwebp kullanın ve kaynak dosyanın piksel ölçüsünü hedef render ölçüsüne göre sınırlayın. Örnek bir CI öncesi adımı şöyledir:
oxipng -o 4 --strip safe assets/icons/*.png
cwebp -q 82 assets/marketing/hero.png -o assets/marketing/hero.webp
Fontlarda ise yalnızca kullanılan ağırlıkları ekleyin. Bir variable font dosyasını tek dosya olduğu için otomatik olarak küçük varsaymak hatadır; Latin dışı glif tabloları önemli yer tutabilir. Font dosyası değişikliğinin etkisini App Size ağacındaki asset düğümünden ve APK içindeki sıkıştırılmış boyuttan ayrı ayrı kontrol edin.Cross platform mobil uygulama geliştirme için CI boyut kapısı
Boyut bütçesini toplam dosya boyutu yerine hedef artefakt bazında tanımlayın: arm64 APK, AAB cihaz indirme boyutu ve iOS IPA için ayrı eşikler kullanın. Pull request pipeline'ında ana dal artefaktını indirin, aynı Flutter SDK sürümü ve aynı target-platform ile yeniden üretin, sonra byte farkını hesaplayın. Aşağıdaki kontrol, arm64 APK'nin 300 KB'den fazla büyümesini fail eder.
baseline=$(stat -c%s artifacts/main/app-arm64-release.apk)
current=$(stat -c%s build/app/outputs/flutter-apk/app-release.apk)
delta=$((current - baseline))
limit=$((300 * 1024))
printf 'baseline=%s current=%s delta=%s\n' "$baseline" "$current" "$delta"
test "$delta" -le "$limit"
Salt eşik yeterli değildir: kabul edilen büyüme için PR açıklamasına App Size ekran görüntüsü veya analiz JSON'u, en büyük iki bileşenin önce-sonra değerleri ve gerekçe ekleyin.Yaygın CI hatası, dependency lock dosyası değiştiği halde boyut karşılaştırmasını anlamlandırmamaktır. pubspec.lock değişmişse transitive bir Android AAR veya native .so eklenmiş olabilir; flutter pub deps --style=compact çıktısını iki commit arasında diff edin. Bu pratik, flutter state management paketi güncellemesinin yalnızca Dart API'sini değil, örneğin analytics ya da platform channel bağımlılığını da getirdiğini ortaya çıkarır. Böylece flutter eğitimi örnek uygulamalarında başlayan küçük paket kararları, üretim uygulamasında izlenebilir bir dağıtım maliyetine bağlanır.
İlgili Eğitim
YTÜSEM İlgili Eğitim
Sık Sorulan Sorular
Flutter mobil uygulama geliştirmede APK boyutu neden debug ve release arasında farklıdır?
Debug APK Dart VM, servis protokolleri ve farklı optimizasyon bayrakları taşır. Karşılaştırmayı flutter build apk --release --target-platform android-arm64 ile yapın; aynı ABI, aynı Flutter SDK ve aynı asset seti olmadan byte farkını yorumlamayın.
Flutter state management paketi uygulama boyutunu nasıl etkiler?
Paketin adı tek başına belirleyici değildir. Kök provider, singleton veya observer kaydı üzerinden oluşturulan sınıflar Dart AOT erişilebilirlik grafiğine girer. DevTools App Size içinde libapp.so düğümünü inceleyin, debug observer kayıtlarını const bool.fromEnvironment ile üretimden ayırın ve sonra aynı release artefaktını ölçün.
Dart programlama eğitimi alan biri Flutter tree shaking sonucunu nasıl doğrular?
Önce flutter build apk --analyze-size ile varsayılan release çıktısını alın. Sonra yalnızca const derleme zamanı bayrağıyla korunan bir modülü ekleyin veya çıkarın, ikinci analizi çalıştırın ve App Size ağacında ilgili Dart kütüphanesinin delta değerini karşılaştırın. SharedPreferences gibi runtime koşullarıyla yapılan deney bu sonucu kanıtlamaz.
Cross platform mobil uygulama geliştirmede AAB boyutu APK boyutundan neden farklı görünür?
AAB yayın formatıdır; mağaza cihaz ABI'si, yoğunluğu ve dili için split APK üretir. bundletool get-size total --apks=... --device-spec=... komutuyla temsil' cihazlarda indirme boyutunu ölçün. Universal APK, tüm ABI kütüphanelerini içerdiği için kullanıcı indirme boyutunu temsil etmez.
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.


