Sürüm paketini (app bundle) derle
Google Play yeni uygulamalar için yalnız Android App Bundle (.aab) kabul eder. Flutter bunu tek komutla derler, varsayılan mod da release'tir. Önce iki şeyi kontrol et; ikisi de test ediciler uygulamayı aldıktan sonra zor düzelir.
Uygulama kimliğini belirle
android/app/build.gradle.ktsiçindeapplicationIddeğerinecom.yourcompany.appgibi benzersiz bir ters alan adı ver. Google Play'e ilk yüklemeden sonra değiştirilemez.INTERNET iznini kontrol et
Uygulama ağa bağlanıyorsa
android/app/src/main/AndroidManifest.xmldosyasıandroid.permission.INTERNETiznini bildirmeli. Debug ve profile manifest'lerinde bu izin var; release'te ancak sen eklersen olur.Paketi derle
Aşağıdaki komutu proje kökünde çalıştır. Flutter paketi
build/app/outputs/bundle/release/klasörüne yazar.
flutter build appbundleFlavor kullanıyor musun? Yayınlamak istediğini derle, örneğin flutter build appbundle --flavor production, ve üretim paket adını ve API anahtarlarını kullandığını kontrol et.
İmzala: yükleme anahtarı ve Play Uygulama İmzalama
Yeni uygulamalarda Play Uygulama İmzalama zorunlu: uygulama imzalama anahtarını Google saklar, sen her yüklemeyi kendi yükleme anahtarınla imzalarsın. Yükleme anahtarını kaybedersen Google'dan sıfırlamasını isteyebilirsin; uygulaman onunla birlikte kaybolmaz. Anahtarı keytool ile oluştur:
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
-storetype JKS -keysize 2048 -validity 10000 -alias uploadSonra şifreleri ve anahtar deposunun yolunu içeren android/key.properties dosyasını oluştur. Bu dosyayı da .jks dosyasını da sürüm kontrolüne ekleme:
storePassword=<keystore password>
keyPassword=<key password>
keyAlias=upload
storeFile=/Users/<you>/upload-keystore.jksDosyayı android/app/build.gradle.kts içinde yükle ve release derleme türünü yeni imza yapılandırmasına bağla:
import java.util.Properties
import java.io.FileInputStream
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
android {
// ...
signingConfigs {
create("release") {
keyAlias = keystoreProperties.getProperty("keyAlias")
keyPassword = keystoreProperties.getProperty("keyPassword")
storeFile = keystoreProperties.getProperty("storeFile")?.let { file(it) }
storePassword = keystoreProperties.getProperty("storePassword")
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
}
}
}Eski projeler build.gradle.kts yerine build.gradle (Groovy) kullanır; alanlar aynıdır. Gradle dosyalarını değiştirdikten sonra flutter clean çalıştır.
Sürüm kodu ve hedef API düzeyi
Her yüklemenin sürüm kodu, hangi kanalda olursa olsun daha önce yüklediğin tüm paketlerden büyük olmalı. Flutter'da bu, pubspec.yaml içindeki + işaretinden sonraki sayıdır:
version: 1.0.0+11.0.0 kullanıcıların gördüğü sürüm adı olur, 1 ise sürüm kodu. Bunu +2, +3 diye artır ya da derlerken ikisini --build-name ve --build-number ile ez.
31 Ağustos 2026'dan beri yeni uygulamalar ve güncellemeler Android 16'yı (API düzeyi 36) ya da üstünü hedeflemek zorunda. Gradle dosyası targetSdk = flutter.targetSdkVersion kullandığı için bunu yükseltmenin olağan yolu Flutter'ı güncellemektir. Flutter sürümün eskiyse targetSdk = 36 değerini kendin yaz ve yüklemeden önce yeni bir Android sürümünde test et.
Kapalı testi geciktiren Flutter tuzakları
- Tekrar kullanılan derleme numarası. Play Console sürüm kodu daha önce kullanılmış paketi reddeder. Yüklemeyi planladığın her derlemeden önce
pubspec.yamliçindeki+Ndeğerini artır. - Sembolsüz gizleme.
--obfuscateyalnız--split-debug-infoile birlikte çalışır. Yüklediğin her derlemenin sembol klasörünü sakla; yoksa test edicilerden gelen çökme kayıtlarını okuyamazsın. - Yanlış flavor. Flavor kullanınca staging uç noktalarıyla staging derlemesini yüklemek kolaydır. Test ediciler de üretim kullanıcılarının hiç görmeyeceği hataları bildirir.
- Release'te ağ yok. Ana manifest'te INTERNET izni eksikse uygulama debug'da çalışır, test edicilerde sessizce başarısız olur.
- Debug imzalı paket.
releasederleme türü hala debug imza yapılandırmasını kullanıyorsa Play Console yüklemeyi reddeder. - Eski native kodlu eklentiler.
.sokitaplığı içeren eklentiler 16 KB bellek sayfalarını desteklemeli. Play Console bunun için uyarır ve 1 Şubat 2027'den itibaren desteklemeyen güncellemeler yayınlanamaz. Eklentileri ve Flutter SDK'sını testin ortasında değil, öncesinde güncelle.
flutter build appbundle --obfuscate --split-debug-info=build/symbolsTest edicilerden gelen çökme raporlarını oku
Test ediciler hata raporlarına yığın izi (stack trace) yapıştırır, Play Console da çökmeleri İzle ve iyileştir → Android vitals → Çökmeler ve ANR'ler altında toplar. Flutter'da bir yığın izinin iki yarısı vardır: --obfuscate ile kısa ve anlamsız adlara dönüşen Dart kısmı ve R8'in küçülttüğü Android kısmı. Flutter release derlemelerinde kod küçültmeyi her zaman açar; ikisine de hazırlıklı ol.
Dart sembollerini sakla
--split-debug-infoile yapılan bir derleme, her mimari içinapp.android-arm64.symbolsgibi bir sembol dosyası yazar. Klasörü ait olduğu sürüm koduyla birlikte sakla: başka bir derlemenin dosyası bu izi çözemez.Dart izlerini çöz
İzi bir dosyaya kaydet ve cihazın mimarisine ait sembol dosyasıyla birlikte
flutter symbolizekomutuna ver. Güncel telefonların çoğu arm64'tür.Java tarafını Play Console'a bırak
Android Gradle eklentisi 4.1 ve üstünde R8 eşleme dosyası
.aabiçinde gider; Play Console eklentilerden gelen Java ve Kotlin satırlarını ayrıca dosya yüklemeden çözer.
flutter symbolize -i crash.txt -d build/symbols/app.android-arm64.symbolsGizleme yalnız sembollerin adını değiştirir; hiçbir şeyi şifrelemez ve gizli bilgiler için uygun bir yer değildir. runtimeType.toString() değerini bir sınıf adıyla karşılaştıran kod gizlemeden sonra bozulur; enum adları ise okunur kalır.
Kısaca Play Console: kapalı testten üretime
Flutter paketin derlenip imzalandıktan sonra gerisi Play Console'da geçer ve her çatıda aynıdır. Bu, kısa kontrol listesi; her menü ve ekran Play Console adımlarının tamamında anlatılıyor.
- Uygulama kurulumunu bitir: Kontrol Paneli'nde gizlilik politikası, uygulama erişimi, reklamlar, içerik derecelendirmesi, hedef kitle, veri güvenliği ve mağaza girişi.
- Kapalı test sürümü oluştur: Test et ve yayınla → Test → Kapalı test altında test edicilerinin ülkelerini seç,
.aabdosyasını yükle ve incelemeye gönder. - Test edicileri Google Group ile ekle: Test ediciler sekmesinde grubu ekle ve opt-in bağlantısını paylaş. Bağlantı, kanal Yayınlandı durumuna geçince çalışır.
- En az 12 test ediciyi 14 gün kesintisiz opt-in tut. Dahili test sayılmaz; ayrılıp geri dönen birinin 14 günü baştan başlar.
- Test sırasında en az bir güncelleme yayınla ve test edicilerin ne bulduğunu, senin neyi değiştirdiğini not et.
- Üretime başvur: Kontrol Paneli'nden başvur ve testin, uygulaman ve hazırlığın hakkındaki üç bölümü yanıtla. Karar Google'ındır; kimse onayı garanti edemez.
Ayrılanları hesaba kat: 12 kişiden fazlasını bul ki biri ayrıldığında takvimin uzamasın. Play Console adımlarının tamamını gör.
Play Console adımlarının tamamı
Kapalı test kanalı, Google Group ve opt-in bağlantısı, 12 test edici / 14 gün kuralı ve üretim başvurusu, tek sayfada adım adım.
Test sırasında test edicilere düzeltme gönder
Flutter'da: derleme numarasını artır, yeniden derle ve yeni paketi aynı kapalı test kanalına yükle.
flutter build appbundle --build-name=1.0.1 --build-number=2Her yüklemeden önce release derlemesini gerçek bir telefonda çalıştır. flutter install release APK'sını bağlı cihaza kurar; eksik izinleri, yanlış flavor'ı ve yalnız release'te çıkan çökmeleri dakikalar içinde yakalarsın:
flutter build apk
flutter installYüklemek üzere olduğun paketin kendisini denemek için onu Google'ın bundletool aracıyla cihaz APK'larına çevir ya da kapalı test kanalına yükleyip bir test edici hesabıyla Google Play'den kur. Böylece Play'in cihaza göre böldüğü APK'lar dahil, test edicilerin aldığını test edersin.
- Her güncellemede tek ve net bir değişiklik. Küçük sürümler hangi düzeltmenin hangi test edici raporuna yanıt verdiğini netleştirir ve üretim erişimi formu için somut örnekler sağlar.
- Test ortasında Flutter sürümünü değiştirme; test edicilerin bildirdiği bir hata gerektirmiyorsa. SDK yükseltmesi motoru, her eklentinin yerel kodunu ve belki
targetSdkdeğerini aynı anda değiştirir. - İncelemeye zaman bırak. Kapalı test kanalındaki her yeni sürüm test edicilere ulaşmadan önce Google'a gönderilir; son düzeltmeni son güne bırakma.
Sık sorulan sorular
Kapalı test için --obfuscate gerekli mi?
Hayır. Gizleme isteğe bağlıdır ve yalnız Dart sembollerinin okunmasını zorlaştırır. Kullanırsan her zaman --split-debug-info ile birlikte kullan ve sembolleri arşivle; yoksa test edicilerin gönderdiği çökmeler okunamaz.
Google Play hangi sürüm kodunu görür?
pubspec.yaml içindeki + işaretinden sonraki sayıyı ya da verdiysen --build-number değerini. Flutter derleme adını versionName, derleme numarasını versionCode olarak kullanır.
Test edicilere APK verebilir miyim?
Google Play üzerinden hayır: yeni uygulamalar .aab olarak yüklenmeli ve yalnız kapalı test kanalından yapılan kurulumlar 12 test ediciye sayılır. flutter build apk --split-per-abi yine de kendi telefonlarında hızlı kontroller için işe yarar.
Play Console neden 16 KB bellek sayfaları konusunda uyarıyor?
Genellikle bir eklenti 16 KB sayfalara hizalanmamış yerel .so kitaplıkları getirir. Eklentiyi ve Flutter'ı güncelle, yeniden derle ve bir sonraki yüklemeden önce 16 KB sayfa boyutlu sistem görüntüsü olan bir Android emülatöründe doğrula.
Kaynaklar
Teknik ayrıntılar aşağıdaki resmi belgelerle kontrol edildi. Menüler ve varsayılanlar sürümden sürüme değişir; şüphede kalırsan resmi sayfa esastır.
- Flutter: Build and release an Android app
- Flutter: Obfuscate Dart code
- Android Developers: Sign your app
- Android Developers: Target API level requirements
- Android Developers: Support 16 KB page sizes
- Android Developers: bundletool
- Play Console Help: App testing requirements for new personal developer accounts
- Play Console Help: Set up an open, closed, or internal test
- Play Console Help: Deobfuscate or symbolicate crash stack traces
12 test edici kuralında yeni misin?
Genel rehber Google'ın şartını, bir TestBunny kampanyasının gün gün nasıl ilerlediğini ve neyi garanti edip edemediğimizi anlatır.
Genel rehberi oku