İçeriğe geç

Kurulum rehberleri · Kotlin / Jetpack Compose

Kotlin ve Jetpack Compose uygulamaları için Google Play kapalı testi

Android Studio'daki native Android projeleri için: imzalı sürüm paketini IDE'den ya da Gradle ile derle, kapalı test kanalını kur ve 12 test ediciyi 14 gün opt-in tut; R8'in ve yeni API düzeylerinin getirdiği yalnız release'te görülen hatalara düşmeden.

Derleme
./gradlew bundleRelease
Sürüm kodu
defaultConfig → versionCode
Hedef API
targetSdk = 36

İmzalı sürüm paketini derle

  1. Uygulama kimliğini belirle

    app/build.gradle.kts içinde defaultConfig altındaki applicationId, uygulamayı Google Play'de tanımlar ve ilk yüklemeden sonra değişemez. namespace yalnız kod içindir ve farklı olabilir.

  2. Android Studio'dan derle

    Build → Generate Signed Bundle/APK'yı seç, Android App Bundle'ı işaretle, anahtar deposunu ve anahtarı seç (ya da Create new), release derleme varyantını seç ve Create'e tıkla.

  3. Ya da komut satırından derle

    İmzalama Gradle'da kurulduktan sonra (sonraki bölüm) aşağıdaki görevi çalıştır. Paket app/build/outputs/bundle/release/ klasörüne yazılır.

Terminal
./gradlew bundleRelease

Yüklemeden önce release varyantını bir cihaza kur. R8'den ya da yalnız release'e özgü yapılandırmadan kaynaklanan hatalar debug çalıştırmada hiç görünmez:

Terminal
./gradlew installRelease

Yükleme anahtarı ve Play Uygulama İmzalama

Yeni uygulamalar Play Uygulama İmzalama kullanmak zorunda: uygulama imzalama anahtarını Google saklar, sen her yüklemeyi bir yükleme anahtarıyla imzalarsın. Android Studio sihirbazı anahtar deposunu oluşturabilir; en az 25 yıl geçerlilik önerir.

Komut satırından ya da CI'dan imzalamak için bilgileri sürüm kontrolü dışındaki bir keystore.properties dosyasında tut ve app/build.gradle.kts içinde oku:

keystore.properties
storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=upload
storeFile=/path/to/upload-keystore.jks
app/build.gradle.kts
import java.io.FileInputStream
import java.util.Properties

val keystoreProperties = Properties().apply {
    load(FileInputStream(rootProject.file("keystore.properties")))
}

android {
    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["keyPassword"] as String
            storeFile = file(keystoreProperties["storeFile"] as String)
            storePassword = keystoreProperties["storePassword"] as String
        }
    }
    buildTypes {
        release {
            isMinifyEnabled = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
            signingConfig = signingConfigs.getByName("release")
        }
    }
}

Anahtar deposunu ve iki şifreyi yedekle. Yükleme anahtarı kaybolur ya da sızarsa yenisini oluştur ve Play Console'dan yükleme anahtarı sıfırlaması iste; uygulama imzalama anahtarı aynı kalır.

Sürüm kodu ve hedef API düzeyi

versionCode hangi kanalda olursa olsun yüklediğin her paketten büyük olmalı; versionName kullanıcıların gördüğü değerdir. İkisi de SDK düzeylerinin yanında, defaultConfig içindedir:

app/build.gradle.kts
android {
    compileSdk = 36
    defaultConfig {
        applicationId = "com.yourcompany.app"
        targetSdk = 36
        versionCode = 2
        versionName = "1.0.1"
    }
}

31 Ağustos 2026'dan beri yeni uygulamalar ve güncellemeler Android 16'yı (API düzeyi 36) hedeflemek zorunda. targetSdk değerini yükseltmek yeni platform davranışlarını açar. Android 15 ve üstünü hedefleyen uygulamalar kenardan kenara çizilir ve Android 16'da bundan çıkış artık çalışmaz; test başlamadan Compose ekranlarının pencere boşluklarını (insets) doğru işlediğini kontrol et.

Kotlin ve Compose tuzakları

  • R8 yansımanın ihtiyacını siler. isMinifyEnabled = true ile serileştirme modelleri, Retrofit ya da Gson sınıfları ve bazı bağımlılık enjeksiyonu kurulumları yalnız release'te bozulabilir. Koruma kurallarını proguard-rules.pro dosyasına ekle ve release varyantını test et.
  • Kenardan kenara sürprizleri. Durum ve gezinme çubuklarının altına çizilen içerik düğmeleri gizler. Test edicilerin göreceği her ekranda Scaffold boşluğunu ya da WindowInsets değiştiricilerini kullan.
  • Hata ayıklanabilir release. Release derleme türünde isDebuggable = true olursa Play Console paketi reddeder.
  • git'te imza sırları. build.gradle.kts içine doğrudan yazılan şifreler deponda kalır. Onları keystore.properties ya da CI sırlarında tut.
  • Native kitaplıklar ve 16 KB sayfalar. Saf Kotlin uygulamaları 16 KB bellek sayfalarını zaten destekler, ama NDK kodu ve .so dosyası içeren kitaplıklar yeniden derlenmeli ya da güncellenmeli. Play Console bunun için uyarır ve 1 Şubat 2027'den itibaren desteklemeyen güncellemeler yayınlanamaz.
  • Yalnız debug'ı test etmek. Test ediciler release varyantını alır. Her yüklemeden önce onu en az bir yeni Android sürümünde çalıştır.

Okunur yığın izleri: R8 eşlemesi ve yerel semboller

Test ediciler yalnız release varyantını çalıştırır; bu yüzden çökmeleri, sınıf ve metot adları değiştirilmiş, R8 ile optimize edilmiş koddan gelir. Derleme bunu geri çeviren eşlemeyi app/build/outputs/mapping/release/mapping.txt dosyasına yazar, her derlemede üzerine yazar ve ayrıca .aab içine koyar.

  1. Gizlemeyi Play Console çözsün

    Android Gradle eklentisi 4.1 ve üstünde Play Console eşleme dosyasını yüklenen paketten alır. İzle ve iyileştir → Android vitals → Çökmeler ve ANR'ler altındaki çökmeler böylece gerçek sınıf ve metot adlarını gösterir.

  2. Her sürüm için bir kopya sakla

    Yüklediğin her sürüm koduyla birlikte mapping.txt dosyasını arşivle. Test edicilerin hata raporlarına yapıştırdığı izler ve Google Play dışındaki her çökme aracı için ona ihtiyacın olur.

  3. Elle retrace et

    Komut satırı araçlarındaki retrace aracını eşleme dosyası ve izi içeren bir dosyayla çalıştır. Güncel Android Studio sürümleri Logcat'te yığın izlerini otomatik olarak da çözer.

Terminal (project root)
$ANDROID_HOME/cmdline-tools/latest/bin/retrace \
  app/build/outputs/mapping/release/mapping.txt trace.txt

NDK mı kullanıyorsun? Release derleme türünde debugSymbolLevel değerini ayarla. SYMBOL_TABLE Play Console'da fonksiyon adlarını verir, FULL dosya ve satır numaralarını da ekler. Uygulama paketlerinde yerel semboller otomatik olarak dahil edilir ve yüklenir.

app/build.gradle.kts
android {
    buildTypes {
        release {
            ndk {
                debugSymbolLevel = "FULL" // or "SYMBOL_TABLE"
            }
        }
    }
}

R8 beklemediğin bir kodu tutuyorsa ya da yansımanın (reflection) ihtiyaç duyduğu kodu siliyorsa -whyareyoukeeping tutulan bir sınıftan giriş noktasına giden yolu gösterir; eşlemenin yanındaki configuration.txt de birleştirilmiş tüm kuralları listeler.

Kısaca Play Console: kapalı testten üretime

Kotlin / Jetpack Compose 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ç

Paketin kendisini test et ve güncelleme yayınla

versionCode'u artır, paketi yeniden derle (Gradle ya da Android Studio sihirbazı) ve aynı kapalı test kanalına yükle.

Terminal
./gradlew bundleRelease

Yüklemek üzere olduğun paketi kurmak için ondan bundletool ile cihaza özel APK'lar üret ve yükleme anahtarınla imzala. Ekran yoğunluğu, dil ve ABI'ye göre cihaz bazlı bölmeler dahil, Google Play'in teslim ettiğine en yakın sonuç budur:

Terminal
bundletool build-apks --connected-device \
  --bundle=app/build/outputs/bundle/release/app-release.aab --output=app.apks \
  --ks=/path/to/upload-keystore.jks --ks-key-alias=upload
bundletool install-apks --apks=app.apks

Kendi ekibinin hızlı kontrolleri için Play Console'un dahili uygulama paylaşımı her sürüm kodunu kabul eder ve 100 kişiye kadar bir indirme bağlantısı verir. Bu yüklemeler bir test kanalının parçası olamaz ve kapalı testin yerini tutmaz: 12 test edicin her zaman kapalı test kanalından kurar.

Sık sorulan sorular

mapping.txt dosyasını kendim mi yüklemeliyim?

Android Gradle eklentisi 4.1 ve üstüyle derlenen uygulama paketlerinde hayır: Play Console onu .aab içinden alır. APK'lar elle yükleme ister, Google Play dışındaki çökme araçlarına da ayrı kopya gerekir; dosyayı her durumda arşivle.

Küçültme (minification) zorunlu mu?

Hayır. isMinifyEnabled = true isteğe bağlıdır: kodunu küçültür ve gizler; release derlemesinin çöküp debug'ın çalışmasının en yaygın nedeni de odur. Açarsan her yüklemeden önce release varyantını test et.

Kotlin uygulamaları 16 KB bellek sayfaları için iş gerektirir mi?

Yalnız Kotlin ya da Java ile yazılmış uygulamalar 16 KB sayfaları zaten destekler. NDK kodu ya da .so dosyası getiren kitaplıklar varsa Android Gradle eklentisi 8.5.1 ve üstünü ve NDK r28 ve üstünü kullan, o kitaplıkları güncelle ve 16 KB emülatör görüntüsünde test et.

Önce dahili test yapmalı mıyım?

Yapabilirsin. Dahili test hızlı kurulur ve ekibinle bir duman testi için iyidir, ama 12 test edici kuralına sayılmaz; kapalı testi geciktirmesine izin verme.

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.