Sürüm paketini (app bundle) derle
React Native JavaScript kodunu native Android derlemesinin içine paketler; bu yüzden sürüm .aab dosyası Gradle'dan çıkar. Önce imzalamayı kur (sonraki bölüm), sonra:
Paket adını kontrol et
android/app/build.gradleiçindekiapplicationId, Google Play'e yükledikten sonra kalıcıdır. İstediğin değer olduğundan emin ol.Derle
Proje kökünde
npx react-native build-android --mode=releaseçalıştır ya da Gradle'ı aşağıdaki gibi doğrudan çağır. İkisi debundleReleasegörevini çalıştırır ve JavaScript'i uygulamaya paketler.Dosyayı bul
Paket
android/app/build/outputs/bundle/release/app-release.aabyoluna yazılır.Sürüm derlemesini test et
Debug uygulamasını kaldır, ardından aşağıdaki ikinci komutla release varyantını gerçek bir cihaza yükle. Yalnız release'te görülen çökmeler Play Console'da değil, burada ortaya çıkar.
cd android
./gradlew bundleReleasenpm run android -- --mode="release"gradle.properties içinde org.gradle.configureondemand=true ayarlama. Sürüm derlemesinin JavaScript ve varlıkları paketlemeyi atlamasına yol açabilir; test edicilere açılmayan bir uygulama gider.
Yükleme anahtarı ve Play Uygulama İmzalama
Google Play yeni uygulamalarda Play Uygulama İmzalama'yı zorunlu tutar: uygulama imzalama anahtarını Google saklar, sen yüklemeleri bir yükleme anahtarıyla imzalarsın. Anahtarı JDK ile gelen keytool ile oluştur:
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore \
-alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000Dosyayı android/app/ klasörüne taşı ve bilgileri git'e hiç girmesinler diye ~/.gradle/gradle.properties dosyasına yaz:
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****Sonra android/app/build.gradle içine bir release imza yapılandırması ekle ve release derleme türünde kullan. Şablondaki release derleme türü sen bunu değiştirene kadar debug anahtarıyla imzalar:
android {
signingConfigs {
release {
if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
}
buildTypes {
release {
// ...
signingConfig signingConfigs.release
}
}
}Sürüm kodu ve hedef API düzeyi
Her yüklemenin versionCode değeri, daha önce yüklediğin her şeyden büyük olmalı. Çıplak projede bu değer android/app/build.gradle içindedir; versionName kullanıcıların gördüğü etikettir:
android {
defaultConfig {
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. SDK düzeyleri android/build.gradle içindeki ext bloğunda durur (compileSdkVersion, targetSdkVersion). Yeni React Native sürümleri bunları yükseltir. Eski bir sürümdeysen yalnız targetSdkVersion'ı artırmak yerine React Native'i güncellemek genelde daha güvenlidir, çünkü native kitaplıklarının da uyumlu olması gerekir.
React Native tuzakları
- Debug imzalı paket. Release derleme türünü
signingConfigs.release'e geçirmeyi unutursan Play Console yüklemeyi debug imzalı diye reddeder. - R8/ProGuard sürprizleri.
enableProguardInReleaseBuilds = trueile yansımaya (reflection) dayanan kitaplıklar yalnız release'te çökebilir. Koruma kurallarınıandroid/app/proguard-rules.prodosyasına ekle ve release derlemesini cihazda test et. - Okunamayan çökme kayıtları. Varsayılan motor Hermes önceden derlenmiş bytecode çalıştırır; release yığın izleri derlenmiş pakete işaret eder. Test edicilerin gönderdiklerini çözebilmek için yüklediğin her derlemenin source map'lerini sakla.
- Uygulama Metro'yu arıyor. Geliştirme sunucusuna bağlanmaya çalışan bir release derlemesi, JavaScript'in paketlenmediği anlamına gelir.
configureondemandayarını kontrol et ve yeniden derle. - Native modüller ve 16 KB sayfalar. Native
.sodosyası olan kitaplıklar 16 KB bellek sayfalarını desteklemeli. Play Console bunun için uyarır ve 1 Şubat 2027'den itibaren desteklemeyen güncellemeler yayınlanamaz. Test başlamadan güncelle. - Kayıp anahtar deposu. Anahtar deposunu ve şifrelerini yedekle. Play Console'dan yükleme anahtarı sıfırlaması isteyebilirsin ama bu, testin ortasında kaybetmek istemeyeceğin kadar zaman alır.
Test edicilerden gelen çökmeleri sembolize et
Release derlemesindeki bir JavaScript çökmesi sana p@1:132161 gibi bir Hermes bayt kodu konumu olarak gelir; bu tek başına hiçbir şey söylemez. React Native, Android release derlemeleri için kaynak haritalarını (source map) varsayılan olarak üretir; önemli olan, yüklediğin her paket için doğru haritayı saklamaktır.
Kaynak haritasını arşivle
Her release derlemesinden sonra haritayı
android/app/build/generated/sourcemaps/react/release/klasöründen kopyala ve sürüm koduyla etiketle. Harita, çöken derlemenin tam olarak aynı commit'iyle eşleşmeli: küçük kod değişiklikleri bile konumları kaydırır.metro-symbolicate çalıştır
Test edicinin yığın izini bir dosyaya kaydet ya da doğrudan
adb logcatçıktısından oku ve o haritaylametro-symbolicatearacından geçir. Araç bayt kodu konumlarını dosya adlarına, satırlara ve fonksiyon adlarına geri çevirir.Yerel satırlara Play Console'da bak
Yerel modüllerin Java ya da Kotlin kodundaki çökmeler İzle ve iyileştir → Android vitals → Çökmeler ve ANR'ler altında görünür. R8 açıksa
.aabiçindeki eşleme dosyası bunları ek yükleme olmadan okunur hale getirir.
# From a saved stack trace
npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.map < stacktrace.txt
# From a connected device
adb logcat -d | npx metro-symbolicate android/app/build/generated/sourcemaps/react/release/index.android.bundle.mapmetro-symbolicate çıktı vermeden hemen kapanıyorsa girdi almamıştır: izi terminale yazarak değil, bir pipe ya da yönlendirmeyle ver.
Kısaca Play Console: kapalı testten üretime
React Native 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 güncelleme yayınla
React Native'de: versionCode'u (ve versionName'i) artır, yeniden derle ve yeni paketi aynı kapalı test kanalına yükle.
cd android
./gradlew bundleReleaseRelease varyantını npm run android -- --mode="release" ile kurmadan önce debug uygulamasını kaldır; Android, başka bir anahtarla imzalanmış uygulamanın üzerine kurmaz. Bu kontrolü her yüklemeden önce tekrarla, çünkü eksik keep kuralları gibi yalnız release'e özgü sorunlar debug'da hiç görünmez.
Kablosuz (OTA) JavaScript güncellemeleri pek çok ekibin sorduğu gri bir alandır. Google Play'in Cihaz ve Ağ Kötüye Kullanımı politikasına göre bir uygulama kendini Google Play dışında güncelleyemez; ancak bu kısıtlama, JavaScript gibi bir sanal makinede ya da yorumlayıcıda çalışan kod için geçerli değildir. Yerel kod, yeni izinler ve yerel modüller her zaman Google Play üzerinden yeni bir paket gerektirir.
- Ana yol kapalı test kanalı olsun. Kapalı test kanalındaki yeni bir
versionCode, opt-in olmuş her test ediciye Google Play üzerinden ulaşır ve sürüm geçmişinde görünür. - Yerel bağımlılıklara dokunma. Test ortasında React Native'i ya da bir yerel modülü yükseltmek, düzelttiğin hatadan çok daha fazlasını değiştirir. Bunu testten önce ya da üretim erişiminden sonra yap.
- Her sürüm için bir harita sakla. Her yeniden derleme yeni bir kaynak haritası üretir. Onu sürüm koduyla birlikte sakla; yoksa o sürümden gelen bir sonraki çökme raporu çözülemez.
Sık sorulan sorular
Google Play için Hermes gerekli mi?
Hayır, ama React Native'in varsayılan motoru ve çoğu uygulamanın kullandığı motor odur. JavaScript'i önceden bayt koduna derler; bu açılışı hızlandırır ve release yığın izlerinin okunmak için kaynak haritasına ihtiyaç duymasının da nedenidir.
Play Console'a hangi dosyayı yüklerim?
android/app/build/outputs/bundle/release/app-release.aab konumundaki paketi. npx react-native build-android --mode=release Gradle'ın bundleRelease görevini çalıştırır ve tüm JavaScript'ini pakete koyar.
targetSdk'yı yükselttikten sonra arayüzüm neden durum çubuğunun altına kayıyor?
Android 15'i (API düzeyi 35) ya da üstünü hedefleyen uygulamalar kenardan kenara çizilir. react-native-safe-area-context bunu zaten yönetir; kullanmıyorsan test ediciler görmeden önce her ekrana güvenli alan boşlukları ekle.
React Native 16 KB bellek sayfalarını destekliyor mu?
Evet, React Native 0.77'den beri. Daha eski sürümler ve kendi .so dosyalarını getiren yerel modüller desteklemeyebilir. Yükseltmeyi testin ortasında değil, test başlamadan önce yap.
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.
- React Native: Publishing to Google Play Store
- Android Developers: Sign your app
- Android Developers: Target API level requirements
- Android Developers: Support 16 KB page sizes
- React Native: Debugging release builds
- React Native 0.77 release notes (16 KB pages, edge-to-edge)
- Play Policy: Device and Network Abuse
- 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