Android 15 "Vanilla Ice Cream" (API level 35) 2024 Ekim'de stable release, 2026 itibariyle pazar paylaşımı %25+ cihazlarda. Google'ın bu release'i foreground services strict mode, edge-to-edge zorunluluğu, Privacy Sandbox GA, 16KB page size desteği ile 2026 Android ekosistemi için standard. Bu yazı developer perspektifinden Android 15'in en önemli yeniliklerini, breaking change'lerini ve migration stratejisini anlatır.
💡 Pro Tip: targetSdk=35 zorunluluğu Ağustos 2025'te başladı. Eğer targetSdk=34 veya düşükse uygulamanız Play Store'da güncelleme yapamaz. Migration öncelikli.
İçindekiler
- Android 15 Özet
- Edge-to-Edge Zorunluluğu
- Foreground Services Strict Mode
- Privacy Sandbox GA
- 16KB Page Size
- Partial Screen Sharing
- Predictive Back Gesture
- Health Connect Genişleme
- App Archiving
- Migration Checklist
- Sonuç
Android 15 Özet
- API level: 35
- Kod adı: Vanilla Ice Cream
- Stable release: 15 Ekim 2024
- Target requirement: Ağustos 2025'ten itibaren yeni apps için zorunlu
- Update requirement: Ağustos 2025'ten itibaren tüm app updates için zorunlu
Platform İstatistikleri (2026 Q1)
- Android 15: %25.3
- Android 14: %28.7
- Android 13: %22.4
- Android 12: %14.1
- Android 11 ve altı: %9.5
Android 14 hala dominant ama Android 15 hızla yayılıyor.
Edge-to-Edge Zorunluluğu
Android 15 ile edge-to-edge rendering default. Status bar ve navigation bar artık app content'in üstüne çizilir. Eski "insets respected automatically" davranışı gitti.
Compose ile Migration
kotlin
1class MainActivity : ComponentActivity() {2 override fun onCreate(savedInstanceState: Bundle?) {3 super.onCreate(savedInstanceState)4 enableEdgeToEdge() // Explicit olarak enable et (default API 35+)5 6 setContent {7 MyAppTheme {8 // Scaffold otomatik insets handle eder9 Scaffold(10 topBar = { TopAppBar(...) },11 content = { padding ->12 LazyColumn(13 contentPadding = padding // System bar padding'i hesaba kat14 ) { ... }15 }16 )17 }18 }19 }20}View System'de Migration
kotlin
1WindowCompat.setDecorFitsSystemWindows(window, false)2 3ViewCompat.setOnApplyWindowInsetsListener(rootView) { view, insets ->4 val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())5 view.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)6 insets7}Yaygın Sorunlar
- Button'lar bottom'da: Navigation bar altında kalıyor → WindowInsets.systemBars
- Status bar'dan overlap: Top content, status bar altında → .statusBars insets
- Keyboard ile conflict: IME insets handle et → WindowInsets.ime
Foreground Services Strict Mode
Background'dan foreground service başlatma artık çok sıkı. Yeni FGS types:
xml
1<service2 android:name=".MyService"3 android:foregroundServiceType="mediaPlayback|camera|location|microphone|dataSync|specialUse" />Her Tipe Özel İzin
xml
1<!-- Data sync için -->2<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />3<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />4 5<!-- Location için -->6<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />7<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />8<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />9 10<!-- Camera/Mic için -->11<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />12<uses-permission android:name="android.permission.CAMERA" />Runtime Restrictions
Android 15'te bir foreground service başlatmak için:
- App foreground'da olmalı, VEYA
- User visible dialog gösterilmeli, VEYA
- Specific exemption (FCM high priority, etc.)
kotlin
1// Check if can start foreground service2if (ActivityManager.isBackgroundRestricted(context)) {3 // Cannot start FGS — show user a permission dialog4 showFgsPermissionDialog()5} else {6 startForegroundService(intent)7}Eski "background'dan FGS başlat" pattern'i broken. Migration: WorkManager için geçiş yap.
Privacy Sandbox GA
Android 15 Privacy Sandbox GA — third-party cookie alternative + device identifier privacy:
Topics API
Interest-based advertising için user behavior'dan "topics" türetiyor, device-local:
kotlin
1import androidx.privacysandbox.ads.adservices.topics.*2 3val manager = TopicsManager.obtain(context)4val request = GetTopicsRequest.Builder()5 .setAdsSdkName("my_sdk")6 .setShouldRecordObservation(true)7 .build()8 9val topics = manager.getTopics(request)10// topics[0].topicId, topics[0].taxonomyVersionAttribution API
Ad click → conversion tracking, device-local:
kotlin
1val manager = MeasurementManager.obtain(context)2manager.registerSource(Uri.parse("https://adtech.com/source?id=123"))3 4// Later, at conversion:5manager.registerTrigger(Uri.parse("https://adtech.com/trigger?id=456"))SDK Runtime
Third-party SDK'lar artık kendi Linux process'inde isolate çalışıyor — app memory'e access yok.
16KB Page Size
ARM64 cihazlar 4KB'den 16KB'ye page size'a geçiş yapıyor (performans için). Android 15 ikisini de destekliyor.
App Impact
- %30 startup artışı 16KB cihazlarda
- %20 daha az memory usage
- Native library gerekli compat: .so dosyaları 16KB-aligned olmalı
Migration
gradle
1// Gradle'da2android {3 defaultConfig {4 ndk {5 // Her iki page size için build6 abiFilters 'arm64-v8a', 'armeabi-v7a'7 }8 }9}Native library kullanmayan Kotlin-only app'ler otomatik compatible.
Test
bash
1# Pixel 8+ 16KB page size emulator2adb shell getconf PAGE_SIZE3# 16384 = 16KB4 5# App crash'larda page size issue'su büyük ihtimalPartial Screen Sharing
Android 15 ile app'ler sadece app içeriklerini paylaşabiliyor (full screen yerine):
kotlin
1val projectionManager = context.getSystemService(ProjectionManager::class.java)2val intent = projectionManager.createScreenCaptureIntent(3 MediaProjectionConfig.createConfigForUserChoice() // App-only option4)5startActivityForResult(intent, REQUEST_CODE)User dialog'da "share whole screen" or "share just this app" seçebiliyor.
Use Cases
- Video calls (Zoom, Meet): app-only screen share
- Screen recording: sadece belirli app
- Remote assistance: limit sharing scope
Predictive Back Gesture
Android 15'te predictive back default aktif. User back gesture yaparken preview'ı görüyor:
kotlin
1override fun onCreate(savedInstanceState: Bundle?) {2 super.onCreate(savedInstanceState)3 4 onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {5 override fun handleOnBackStarted(backEvent: BackEventCompat) {6 // Back başladı, animation başlat7 }8 9 override fun handleOnBackProgressed(backEvent: BackEventCompat) {10 // User swipe yapıyor, progress göster11 val progress = backEvent.progress // 0.0 - 1.012 animateBackProgress(progress)13 }14 15 override fun handleOnBackPressed() {16 // Back commit edildi17 finish()18 }19 20 override fun handleOnBackCancelled() {21 // User vazgeçti22 resetAnimation()23 }24 })25}AndroidManifest'te enable:
xml
1<application2 android:enableOnBackInvokedCallback="true">3 ...4</application>Health Connect Genişleme
Health Connect API'leri Android 15'te built-in:
kotlin
1import androidx.health.connect.client.*2 3val client = HealthConnectClient.getOrCreate(context)4 5// Read steps6val permissions = setOf(7 HealthPermission.getReadPermission(StepsRecord::class)8)9val granted = client.permissionController.getGrantedPermissions()10 11if (permissions.all { it in granted }) {12 val response = client.readRecords(13 ReadRecordsRequest(14 recordType = StepsRecord::class,15 timeRangeFilter = TimeRangeFilter.between(16 startTime = Instant.now().minus(Duration.ofDays(7)),17 endTime = Instant.now()18 )19 )20 )21 val totalSteps = response.records.sumOf { it.count }22}Fitbit, Samsung Health, Google Fit artık Health Connect üzerinden data paylaşıyor.
App Archiving
User'lar artık app'leri archive edebiliyor (silmeden):
- Install size: %60 azalma (APK preserved, data kept)
- Icon kalıyor, tap ile re-install
- Play Store Google tarafından otomatik
Developer için:
kotlin
1// App archived'den unarchive olurken:2override fun onCreate(savedInstanceState: Bundle?) {3 super.onCreate(savedInstanceState)4 5 val wasArchived = intent.getBooleanExtra("was_archived", false)6 if (wasArchived) {7 // Data hala var, onboarding atla8 }9}Migration Checklist
Android 15'e geçerken:
- ✅ targetSdk=35 güncelle
- ✅ Edge-to-edge zorunluluğu için insets handling
- ✅ Foreground service types belirt, permissions ekle
- ✅ Privacy Sandbox opt-in (ad SDK'sı varsa)
- ✅ 16KB page size native lib compat
- ✅ Partial screen share UI update
- ✅ Predictive back callback migration
- ✅ OnBackPressedDispatcher modern pattern
- ✅ Notification runtime permission check
- ✅ AndroidX library upgrade (Compose 1.7+, Activity 1.9+, etc.)
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
Okuyucu Ödülü
bash
#!/bin/bash# android15-migration-check.sh echo "🔍 Android 15 Migration Check"echo "" # 1. Check targetSdkecho "1. TargetSdk check..."grep -r "targetSdk" app/build.gradle.kts | grep -v "// " | head -3 # 2. Check for deprecated APIsecho "2. Deprecated API check..."grep -r "setDecorFitsSystemWindows" app/src/main || echo "✅ Clean" # 3. Check for foreground service typesecho "3. Foreground service types..."grep -r 'foregroundServiceType' app/src/main/AndroidManifest.xml || echo "⚠️ Missing types" # 4. Check for edge-to-edgeecho "4. Edge-to-edge..."grep -r "enableEdgeToEdge()" app/src/main/java || echo "⚠️ Missing enableEdgeToEdge" # 5. Check AGP versionecho "5. AGP version..."grep "com.android.application" settings.gradle.kts build.gradle.kts echo ""echo "✅ Check complete. Review warnings above."External Resources:
Sonuç
Android 15 incremental ama impact'li bir release. targetSdk=35 zorunluluğu her app'i migration'a zorluyor. Edge-to-edge, foreground service strict mode, Privacy Sandbox production change'leri. 16KB page size performance için büyük kazanç — native lib'lerin uyumu kritik. Migration 1-2 haftalık iş (medium app). 2026 Android 16 Q3'te bekleniyor — speculations: Gemini Nano derin integration, daha strict privacy, battery optimization.
*İlgili yazılar: [Dart 3 Features](./dart-3-new-features), [Flutter Riverpod](./flutter-riverpod-state-management), [Kotlin Coroutines](./kotlin-coroutines-flow).*

