Android 12'ye uyum sağlarken geliştiricinin bilmesi gerekenler

Kerem Aydın·6 Temmuz 2026·⏱4 dk

Kısaca: Android 12 (API 31), yeni çalışma zamanı izinleri (yeni Bluetooth izinleri, yaklaşık konum), PendingIntent ve android:exported için katı gereksinimler, arka plandan ön plan hizmetlerinin başlatılmasını kısıtlama ve otomatik izin sıfırlama davranışı getiriyor; tüm bunlar sürümden önce manifest, kod ve testlerde düzeltmeler gerektiriyor.

Uyumluluğu etkileyen temel değişiklikler

  • PendingIntent: Artık FLAG_IMMUTABLE veya FLAG_MUTABLE belirtilmesi zorunlu. Varsayılan olarak FLAG_IMMUTABLE kullanın ve intent'i gerçekten değiştirdiğinizde (örneğin satır içi yanıt) yalnızca FLAG_MUTABLE ayarlayın.

    • Örnek: PendingIntent.getActivity(ctx, id, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)
  • android:exported: intent-filter içeren Activity/Service/BroadcastReceiver bileşenleri için android:exported="true" veya "false" açıkça belirtilmelidir. Aksi takdirde targetSdk 31 ile derleme/kurma başarısız olur.

  • Ön plan servisleri: S+ hedefleyen uygulamalar için arka plandan startForegroundService başlatılması yasaklandı. Acil görevler için WorkManager (expedited work) veya exact alarm + yürütme anında servis başlatma kullanın.

  • Konum izinleri: Yaklaşık konum seçeneği eklendi — UX, kullanıcının yalnızca ACCESS_COARSE_LOCATION verebileceğini öngörmelidir. Her iki durumu da isteyin ve işleyin.

  • Bluetooth: Eski BLUETOOTH/BLUETOOTH_ADMIN izinlerinin yerine BLUETOOTH_SCAN, BLUETOOTH_CONNECT, BLUETOOTH_ADVERTISE geldi; arka plan taraması için yeni kısıtlamalar var.

  • Uygulama uykusu (app hibernation) ve otomatik izin sıfırlama: Sistem, kullanılmayan uygulamalar için çalışma zamanı izinlerini sıfırlayabilir ve arka plan işlemlerini durdurabilir — izinlerin yeniden alınması ve durumun geri yüklenmesi senaryolarını ekleyin.

  • Bildirimler ve trampoline: Arka plan bileşenlerinden Activity başlatmak için "trampoline" kullanımı kısıtlandı; bildirimlerinizi ve deeplink işlemenizi kontrol edin.

  • Multimedya ve WebView: Platform AVIF desteği ve transkodlama ekledi; WebView SameSite çerezlerini sıkılaştırdı — yerleşik web görünümleri üzerinden kimlik doğrulama senaryolarınızı kontrol edin.

Değişikliklerin çoğu özellikle targetSdkVersion = 31 olan uygulamalar için geçerlidir. Henüz target'ı güncellemeseniz bile Android 12 cihazlarda test yapın.

Sürüm öncesi pratik kontrol listesi

  1. Gradle'da compileSdkVersion = 31 ve targetSdkVersion = 31 değerlerini güncelleyin, projeyi derleyin ve derleme hatalarını düzeltin.
  2. Tüm PendingIntent çağrılarını bulun ve düzeltin — FLAG_IMMUTABLE/FLAG_MUTABLE ekleyin.
  3. mergedManifest'i inceleyin ve intent-filter içeren tüm bileşenler için android:exported değerini açıkça belirtin.
  4. Arka plan görevlerini yeniden yapılandırın: izin verilmeyen startForegroundService kullanımını WorkManager/expedited work veya exact alarm ile değiştirin.
  5. Eski Bluetooth izinlerini yenileriyle değiştirin ve BLUETOOTH_SCAN/CONNECT/ADVERTISE için çalışma zamanı isteklerini uygulayın.
  6. Mantık ve izin isteklerinde approximate location durumunu işleyin.
  7. Özel splash çözümleri kullanıyorsanız SplashScreen API'ye geçiş yapın.
  8. Uygulama uykusundan sonra izinlerin geri kazanılması için UX ekleyin (bilgilendirme ve yeniden isteme).
  9. Üçüncü taraf SDK'ları (push, analitik, ödemeler) API 31 ile uyumlu sürümlere güncelleyin.
  10. Duman testlerini çalıştırın: izin akışları, BLE senaryoları, bildirimler, ön plan işleri, WebView kimlik doğrulaması, medya oynatma/yükleme.

Önce debug derlemesinde targetSdk 31 ile test edin ve Geliştirici seçeneklerinde uyumluluk modlarını etkinleştirin; bu, arıza nedenlerini daha hızlı bulmanıza yardımcı olur.

Test etme ve yaygın sorunlar (ve çözümleri)

  • "requires FLAG_IMMUTABLE" hatası → Tüm PendingIntent çağrılarını bulun ve flag'i belirtin. Statik analiz araçlarını veya projede grep kullanın.
  • Manifest birleştirme: "android:exported needs to be explicitly specified" → Bağımlılıkları ve eklentileri kontrol edin, kütüphane manifestlerini güncelleyin/yamayın.
  • Bluetooth taramasında çökme → BLUETOOTH_SCAN izninin ve çalışma zamanı isteklerinin mevcut olduğundan emin olun; kullanıcı reddini ve arka plan tarama kısıtlamalarını işleyin.
  • ForegroundServiceStartNotAllowedException → Başlatma mantığını WorkManager/expedited work ile değiştirin veya ön plan servisini yalnızca kullanıcı etkileşimi bağlamından (UI etkileşimi) başlatın.
  • WebView SameSite/kimlik doğrulama akışı bozuluyor → Yerleşik tarayıcı üzerinden girişleri test edin, gerekirse harici tarayıcılara veya web auth akışlarına fallback uygulayın.

Yalnızca compileSdk'yi güncellemek ve davranışsal değişiklikleri ele almamak, Android 12 cihazlarda çalışma zamanı çökmelerine neden olabilir. Yalnızca derlemeyi değil, gerçek senaryoları da kontrol edin.

Sık yapılan hatalar

  • PendingIntent'de FLAG_IMMUTABLE unutulmuş.
  • Kütüphanelerden gelen bileşenlerde android:exported belirtilmemiş.
  • BLE davranışının aynı kaldığı varsayımı — arka plan taramaları artık daha katı.
  • Uykudan sonra izinlerin geri kazanılması için UX yok — kullanıcıya açıklama olmadan işlevsellik kaybı.

SSS

  • targetSdk'yi acilen 31'e değiştirmek gerekir mi?

    • Değişikliği planlı yapmak daha iyidir: önce debug dalına alın, tüm derleme hatalarını ve davranışsal gerilemeleri düzeltin, ardından güncellemeyi yayınlayın. Play Console, yeni yayınlamalar için güncellenmiş target gerektirebilir.
  • Kodda tüm PendingIntent'leri nasıl hızlıca bulabilirim?

    • getActivity/getService/getBroadcast araması yapın ve kütüphaneleri gözden geçirin; statik analiz ve CI şablonları eksikleri önlemeye yardımcı olur.
  • Bildirimler Activity başlatmayı bıraktıysa ne yapmalıyım?

    • Trampoline (kısa bir ara receiver/service üzerinden Activity başlatma) kullanmadığınızdan emin olun. PendingIntent'e aktardığınız Intent'te açık bir Activity ve doğru flag'ler belirtin ve FLAG_IMMUTABLE gereksinimlerine uyun.

Bir haftalık kısa plan: target/compile güncelle → derlemeyi düzelt (exported, PendingIntent) → SDK bağımlılıklarını güncelle → Android 12'de manuel test (izinler, BLE, bildirimler, ön plan işleri) → yayın. Gerekiyorsa, yığınınız için diff ve adb/espresso test seti hazırlayabilirim.