Android 8.0 ve 8.1 Arasındaki Farkların Uygulama Uyumluluğuna Etkisi
Kısaca: Android 8.0 (API 26) arka plan servisleri, zorunlu Bildirim Kanalları, kimlik izolasyonu ve yerel kod yüklemesinde sıkılaştırma (W^X) gibi temel kısıtlamalar getirdi. Android 8.1 (API 27) API iyileştirmeleri (Otomatik Doldurma, SharedMemory, Android Go için optimizasyonlar) ekledi ve yeni temel kısıtlamalar getirmedi; çoğu "bozulan" senaryo doğrudan 8.0 ile ilgilidir. Aşağıda neyin kontrol edileceği ve sorunların nasıl hızlıca düzeltileceği açıklanmaktadır.
Uygulamanız Oreo'da "bozulduysa" öncelikle bildirim kanallarını, arka plan servislerinin davranışını ve logcat'teki yerel kütüphane yükleme hatalarını kontrol edin.
Android 8.0 ve 8.1'in Temel Farkları
İçindekiler {{TOC_AUTOMATIC}}
Uyumluluk İçin En Önemli Noktalar
- Arka plan yürütme sınırlamaları (8.0): Arka plandan startService() çağrılması IllegalStateException hatasına yol açabilir; bunun yerine startForegroundService() veya görev planlayıcıları kullanılmalıdır.
- Bildirim Kanalları (8.0): API≥26 hedefleyen uygulamaların bildirimlerinde channelId bulunmalıdır; kanal olmadan bildirimler gösterilmez.
- ANDROID_ID ve gizlilik (8.0): Kimlikler uygulama imza anahtarına göre kopyalanır hale geldi; bunlar genel uygulama dışı ID'ler olarak kullanılamaz.
- W^X ve yerel kütüphaneler (8.0): Hem yazılabilir hem de çalıştırılabilen segmentler yasaklandı; hatalı .so dosyaları çökmelere neden olabilir.
- Android 8.1: Otomatik Doldurma, SharedMemory iyileştirmeleri ve Android Go için geliştirmeler; bunlar çoğunlukla yeni bozucu kısıtlamalar değil, genişletmeler ve optimizasyonlardır.
Gerçek Uyumluluk Sorunları ve Hazır Çözümler
- Bildirimler görünmüyor
- Neden: NotificationChannel eksik veya yanlış.
- Çözüm: Uygulama başlangıcında tüm bildirim türleri için kanallar oluşturun; channelId'nin eşleştiğini doğrulayın. Kotlin örneği:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val ch = NotificationChannel("default_channel", "Temel", NotificationManager.IMPORTANCE_DEFAULT)
(getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(ch)
}
val notif = NotificationCompat.Builder(this, "default_channel")
.setContentTitle("Başlık")
.setContentText("Metin")
.setSmallIcon(R.drawable.ic_notification)
.build()
NotificationManagerCompat.from(this).notify(1, notif)
Kanalları başlangıçta bir kez oluşturun ve kullanıcı bir kanalı devre dışı bırakırsa mantığı koruyun; kanal ayarları ekranını gösterin.
-
Arka plandan startService() çağrıldığında çökme
- Neden: Arka plan çalışma kısıtlamaları.
- Çözüm: Görev uzun sürüyorsa startForegroundService() + 5 saniye içinde startForeground() kullanın; gecikmeli görevler için WorkManager/JobScheduler/JobIntentService kullanın.
-
Arka plan konum güncellemeleri çok seyrek
- Neden: Arka plan konum istekleri için kısıtlamalar.
- Çözüm: Gerçek zamanlı takip gerekiyorsa bildirimli bir ön plan servisi oluşturun; istek sıklığını minimize edin ve Fused Location Provider kullanın.
-
Yerel kütüphaneler nedeniyle çökmeler
- Neden: Yazılabilir+çalıştırılabilir bayraklara sahip .so segmentleri.
- Çözüm: Doğru linker/NDK bayraklarıyla yeniden derleyin, APK/so paketlemesini kontrol edin, derleme araçlarını güncelleyin.
-
Manifest'teki örtük broadcast-Receiver'lar çalışmıyor
- Neden: Çoğu örtük broadcast yasağı.
- Çözüm: Context.registerReceiver() ile dinamik olarak kaydedin veya olay mimarisini yeniden düşünün.
Hızlı Uyumluluk Kontrol Listesi (Pratik Uygulama)
- targetSdkVersion >= 26 mı? Evet ise tüm adımları mutlaka uygulayın.
- Bildirimler: Tüm NotificationChannel(lar) oluşturuldu mu, channelId eşleşiyor mu?
- Servisler: Arka plan startService() çağrılarını WorkManager/JobIntentService veya startForegroundService() + startForeground() ile değiştirin.
- Konum: Arka plan takibi için ön plan servisi kullanın.
- Yerel Kod: Linker hatalarını kontrol edin, W^X ihlallerini kaldırın.
- Broadcasts: Örtük manifest broadcast'lerine bağımlılıktan kaçının.
- Testler: Android 8.0 ve 8.1 üzerinde foreground/background/doze durumlarında manuel/CI testlerini çalıştırın.
OEM pil optimizasyonları (Xiaomi, Huawei vb.) arka plan görevleriyle ilgili sorunların belirtilerini şiddetlendirebilir; gerçek cihazlarda test edin.
Sık Yapılan Hatalar
- Bildirim kanalı oluşturulmadı veya channelId değiştirildi; bildirimler görüntülenmiyor.
- Başlatma/ön plan çözümü yerine arka plandan startService() kullanılması; uygulama çöküyor.
- ANDROID_ID'nin uygulamalar arasında genel bir kimlik olarak kullanılması.
- Yerel kütüphanelerin yanlış paketlenmesi; başlangıçta erişilememesi/çökmeler.
- Artık manifest üzerinden teslim edilmeyen örtük broadcast'lerin beklenmesi.
SSS
- Android Go (8.1) desteği gerekli mi?
Evet, ≤1GB RAM'li cihazları hedefliyorsanız belleği test edin ve optimize edin; Play filtrelemesi "optimize edilmiş" uygulamaları işaretler. - Tüm startService çağrılarını WorkManager'a değiştirmek zorunlu mu?
Hayır: Arka planda acil ve uzun süreli yürütme gerektiren görevler için ön plan servisi kullanın; periyodik/gecikmeli görevler için WorkManager kullanın. - Bildirimlerin "sessizce" alınmamasının nedenini nasıl hızlıca bulurum?
Uygulama ayarlarında bildirim kanallarını ve channelId ile ilgili uyarılar için logcat'i kontrol edin; ayrıca bildirimler için geliştirici hata ayıklama seçeneklerini kullanın.
Proje Destek Önerileri
- CI sistemine Android 8.0 ve 8.1 imajları/emülatörlerinde testler ekleyin ve background→foreground, doze, yeniden başlatma sonrası kurtarma senaryolarını çalıştırın.
- Hata takibinde "Oreo" için ayrı bir etiket ayırın ve bu sürümlerdeki her olay için yığın izleme/logcat verilerini toplayın.
- Yerel kod varsa NDK/derleme araçlarını güncelleyin ve gerçek cihazlarda duman testleri (smoke-tests) çalıştırın.
Projeniz için özel bir kontrol listesi/yama hazırlamamı ister misiniz (targetSdkVersion, kullanılan servisler ve yerel kod varlığına göre)? Bu parametreleri yazın; hazır değişiklikleri oluşturayım.