# Android 15 Developer Rehberi: Privacy Sandbox, Edge-to-Edge, Foreground Services
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
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 2 android:name=".MyService"3 android:foregroundServiceType="mediaPlayback|camera|location|microphone|dataSync|specialUse" />Her Tipe Özel İzin
xml
12 3 4 56 7 8 9 1011 12Runtime 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 2 android:enableOnBackInvokedCallback="true">3 ...4Health 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?
bash
1#!/bin/bash2# android15-migration-check.sh3 4echo "🔍 Android 15 Migration Check"5echo ""6 7# 1. Check targetSdk8echo "1. TargetSdk check..."9grep -r "targetSdk" app/build.gradle.kts | grep -v "// " | head -310 11# 2. Check for deprecated APIs12echo "2. Deprecated API check..."13grep -r "setDecorFitsSystemWindows" app/src/main || echo "✅ Clean"14 15# 3. Check for foreground service types16echo "3. Foreground service types..."17grep -r 'foregroundServiceType' app/src/main/AndroidManifest.xml || echo "⚠️ Missing types"18 19# 4. Check for edge-to-edge20echo "4. Edge-to-edge..."21grep -r "enableEdgeToEdge()" app/src/main/java || echo "⚠️ Missing enableEdgeToEdge"22 23# 5. Check AGP version24echo "5. AGP version..."25grep "com.android.application" settings.gradle.kts build.gradle.kts26 27echo ""28echo "✅ Check complete. Review warnings above."Okuyucu Ödülü
**External Resources:** - [Android 15 release notes](https://developer.android.com/about/versions/15) - [Edge-to-edge migration guide](https://developer.android.com/develop/ui/views/layout/edge-to-edge) - [Foreground services guide](https://developer.android.com/develop/background-work/services/fgs) - [Privacy Sandbox](https://developer.android.com/design-for-safety/privacy-sandbox) - [16KB page size](https://developer.android.com/guide/practices/page-sizes)
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, Flutter Riverpod, Kotlin Coroutines.*

