İmzalı sürüm paketini derle
Uygulama kimliğini belirle
app/build.gradle.ktsiçindedefaultConfigaltındakiapplicationId, uygulamayı Google Play'de tanımlar ve ilk yüklemeden sonra değişemez.namespaceyalnız kod içindir ve farklı olabilir.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.
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.
./gradlew bundleReleaseYü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:
./gradlew installReleaseYü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:
storePassword=myStorePassword
keyPassword=myKeyPassword
keyAlias=upload
storeFile=/path/to/upload-keystore.jksimport 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:
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 = trueile 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.prodosyası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
Scaffoldboşluğunu ya daWindowInsetsdeğiştiricilerini kullan. - Hata ayıklanabilir release. Release derleme türünde
isDebuggable = trueolursa Play Console paketi reddeder. - git'te imza sırları.
build.gradle.ktsiçine doğrudan yazılan şifreler deponda kalır. Onlarıkeystore.propertiesya 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
.sodosyası 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.
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.
Her sürüm için bir kopya sakla
Yüklediğin her sürüm koduyla birlikte
mapping.txtdosyası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.Elle retrace et
Komut satırı araçlarındaki
retracearacı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.
$ANDROID_HOME/cmdline-tools/latest/bin/retrace \
app/build/outputs/mapping/release/mapping.txt trace.txtNDK 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.
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ç,
.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.
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.
./gradlew bundleReleaseYü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:
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.apksKendi 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.
- Android Developers: Sign your app
- Android Developers: Target API level requirements
- Android Developers: Support 16 KB page sizes
- Android Developers: Shrink, obfuscate, and optimize your app
- Android Developers: Troubleshoot app optimization (mapping.txt, retrace)
- Android Developers: Include native debug symbols
- Android Developers: bundletool
- Play Console Help: Internal app sharing
- 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