İçeriğe geç

Kurulum rehberleri · Flutter

Flutter uygulamaları için Google Play kapalı testi

flutter build appbundle'dan Üretim erişimine başvur'a kadar: sürüm paketini derleme ve imzalama, kapalı test kanalını kurma, 12 test ediciyi 14 gün opt-in tutma ve sana bir hafta kaybettiren Flutter hatalarından kaçınma.

Derleme
flutter build appbundle
Sürüm kodu
pubspec.yaml → version: 1.0.0+1
Hedef API
targetSdk ≥ 36

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.

  1. Uygulama kimliğini belirle

    android/app/build.gradle.kts içinde applicationId değerine com.yourcompany.app gibi benzersiz bir ters alan adı ver. Google Play'e ilk yüklemeden sonra değiştirilemez.

  2. INTERNET iznini kontrol et

    Uygulama ağa bağlanıyorsa android/app/src/main/AndroidManifest.xml dosyası android.permission.INTERNET iznini bildirmeli. Debug ve profile manifest'lerinde bu izin var; release'te ancak sen eklersen olur.

  3. Paketi derle

    Aşağıdaki komutu proje kökünde çalıştır. Flutter paketi build/app/outputs/bundle/release/ klasörüne yazar.

Terminal
flutter build appbundle

Flavor 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:

Terminal (macOS / Linux)
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA \
        -storetype JKS -keysize 2048 -validity 10000 -alias upload

Sonra ş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:

android/key.properties
storePassword=<keystore password>
keyPassword=<key password>
keyAlias=upload
storeFile=/Users/<you>/upload-keystore.jks

Dosyayı android/app/build.gradle.kts içinde yükle ve release derleme türünü yeni imza yapılandırmasına bağla:

android/app/build.gradle.kts
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:

pubspec.yaml
version: 1.0.0+1

1.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.yaml içindeki +N değerini artır.
  • Sembolsüz gizleme. --obfuscate yalnız --split-debug-info ile 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. release derleme türü hala debug imza yapılandırmasını kullanıyorsa Play Console yüklemeyi reddeder.
  • Eski native kodlu eklentiler. .so kitaplığı 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.
Terminal
flutter build appbundle --obfuscate --split-debug-info=build/symbols

Test 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.

  1. Dart sembollerini sakla

    --split-debug-info ile yapılan bir derleme, her mimari için app.android-arm64.symbols gibi bir sembol dosyası yazar. Klasörü ait olduğu sürüm koduyla birlikte sakla: başka bir derlemenin dosyası bu izi çözemez.

  2. Dart izlerini çöz

    İzi bir dosyaya kaydet ve cihazın mimarisine ait sembol dosyasıyla birlikte flutter symbolize komutuna ver. Güncel telefonların çoğu arm64'tür.

  3. Java tarafını Play Console'a bırak

    Android Gradle eklentisi 4.1 ve üstünde R8 eşleme dosyası .aab içinde gider; Play Console eklentilerden gelen Java ve Kotlin satırlarını ayrıca dosya yüklemeden çözer.

Terminal
flutter symbolize -i crash.txt -d build/symbols/app.android-arm64.symbols

Gizleme 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ç, .aab dosyası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.

Play Console adımlarını aç

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.

Terminal
flutter build appbundle --build-name=1.0.1 --build-number=2

Her 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:

Terminal
flutter build apk
flutter install

Yü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 targetSdk değ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.

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

14 gün için 12 gerçek test ediciye mi ihtiyacın var?

Uygulamanı ve kapalı test bağlantını ekle, Starter (15 test edici) ya da Pro (25 test edici) planını seç, her test edicinin etkinliğini panelinde gün gün izle.

TestBunny'nin Google ile bir bağlantısı yoktur. Test ediciler nakit değil, kredi kazanır. Google'ın üretim erişimi kararını kimse garanti edemez, biz de etmeyiz.