Bu makale, android eğitimi ve kotlin eğitimi alan geliştiriciler için Jetpack Compose uygulamalarında gerçek profil oluşturma, recomposition azaltma, ViewModel optimizasyonu ve play store yayınlama öncesi ölçülebilir adımlar sunar.
Jetpack Compose Performans Analizi ve Android MVVM Optimizasyon Rehberi
Sorunun tanımı: neden Compose uygulamanızda jank olur? (android eğitimi perspektifi)
Compose tabanlı UI'lerde jank kaynağı iki ana mekanizma ile ilgilidir: gereksiz recomposition (composables sıkça yeniden oluşturuluyor) ve ana iş parçacığında çalışan expensive hesaplamalar. Bu bölümde Android Studio Profiler, Perfetto ve adb gfxinfo ile nasıl nesnel bir baseline alacağınızı gösteriyorum; örneğin Android Studio'da Profile > CPU Profiler ile 30s kayıt alın, ardından Trace'i Perfetto UI'ye export edin. Araç: Android Studio Profiler (Profile).
Profiling adımları: Android Studio, Perfetto ve adb gfxinfo ile baseline alma
Somut adımlar: 1) Uygulamayı debuggable build ile cihazda çalıştırın. 2) Android Studio'da Profile butonuna tıklayın ve CPU Profiler'da 'Record Java/Kotlin' seçeneğiyle 20-30s kayıt alın. 3) Aynı senaryo için bir Perfetto trace alın: Android Studio trace penceresinden 'Export to Perfetto' seçin veya komut satırıyla perfetto kullanın. Örnek adb komutu:
adb shell perfetto -o /data/misc/perfetto-traces/trace.pb -c /data/local/tmp/trace_config.pbAlternatif hızlı metrik: gfxinfo framestats ile frame süresi dağılımını alın:
adb shell dumpsys gfxinfo com.example.app framestats > framestats.txt Daha sonra yüzde 90 frame zamanını hesaplamak için basit bir Python snippet'i çalıştırabilirsiniz; bu size 'neden' sorusuna somut mekanizma verir: UI pipeline hangi aşamada bekliyor. Araçlar: adb, dumpsys gfxinfo, Perfetto UI.Compose seviyesinde optimizasyon: recomposition azaltma ve heavy-lifting amortize etme (jetpack compose)
Ana fikir: gereksiz recomposition'ları engellemek için state dağılımını daraltın ve hesaplama/formatlama gibi expensive işler için memoization kullanın. Aşağıdaki örnek, her keystroke'ta yeniden hesaplanan expensiveTransform'u derivedStateOf ile sadece input değiştiğinde çalıştırır. Kodunuzu Android Studio'da açıp CPU Profiler ile önce/sonra trace alın, 'Main' thread activity'yi karşılaştırın. Araç: Android Studio Profiler, Kotlin stdlib.
@Composable
fun ItemView(data: List- , filter: String) {
// expensiveTransform sadece filter değişince çalışır
val filtered by remember(filter) {
derivedStateOf { expensiveTransform(data, filter) }
}
LazyColumn {
items(filtered) { item ->
Text(item.title)
}
}
}
fun expensiveTransform(data: List
- , filter: String): List
- {
// CPU-bound iş: büyük koleksiyonlar üzerinde map/filter
return data.filter { it.title.contains(filter) }
.map { heavyFormat(it) }
}
Neden işe yarar: derivedStateOf, Snapshot mekanizmasıyla sadece ilgili state değiştiğinde recomposition tetikler; bu sayede Compose'un composition diff işleri azalarak ana thread CPU kullanımını düşürür. Deney: Profiling ile önce 95th percentile frame time 140ms iken, derivedStateOf uygulandıktan sonra 95th percentile 28-35ms aralığına düşebilir. Ölçülendir: aynı senaryoyu 5 kez kayıt edip medyanı raporlayın.
ViewModel, Coroutines ve Flow ile iş yükünü ana iş parçacığından uzaklaştırma (android mvvm mimarisi, kotlin kursu)
Android MVVM mimarisi içinde ağ, parse ve CPU-bound işlemleri ViewModel tarafında Dispatchers.IO veya Dispatchers.Default ile taşıyın ve UI'ya sadece minimal, immutable state yayın. Aşağıdaki ViewModel örneği, network+parse işini IO üzerinde yapıp UI'ya StateFlow ile sadece değişiklikleri yayınlıyor. Araçlar: Kotlin Coroutines, kotlinx-coroutines-core, Android Studio Profiler.
class ItemsViewModel(private val repo: Repo): ViewModel() {
private val _uiState = MutableStateFlow>(emptyList())
val uiState: StateFlow> = _uiState
.map { it } // placeholder for possible mapping
.distinctUntilChanged()
.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())
fun refresh() {
viewModelScope.launch {
val items = withContext(Dispatchers.IO) {
repo.fetchAndParse() // network + parsing off main
}
_uiState.value = items
}
}
}
Profiling yöntemi ve karşılaştırma: Android Studio CPU Profiler ile 'refresh' tetiklendiğinde main thread'te geçirilen toplam CPU süresini ölçün. Değişiklik: repo.fetchAndParse'i Dispatchers.Default'a kaydırmak ağır parsing'i paralel hale getirir; örneğin önce main-thread aktif süresi 200ms ise, doğru dispatcher ile 20-30ms civarına düşer. Ölçümleri reproducible yapmak için adb shell am start -W komutu ile başlatıp, profili her koşuda 5 tekrar alın.
Release optimizasyonu ve Play Store hazırlıkları: boyut, R8 ve yayın akışı (play store yayınlama, android studio eğitimi)
Play Store yayınlama öncesi ölçülebilir kontroller: AAB oluşturun, universal APK oluşturup boyutu ölçün, R8 ProGuard kurallarını ekleyin ve resource shrinking etkinleştirin. Gradle komutu ile release bundle oluşturun:
./gradlew clean bundleRelease BundleTool ile apk üretip inceleyin: bundletool build-apks --bundle=app-release.aab --output=app.apks --mode=universal
bundletool dump --apks=app.apks --output=apks.txtbuild.gradle örneği (module):
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
Ayrıca Compose için R8 kuralları ekleyin: -keepclassmembers class androidx.compose.* { *; }
-keepnames class androidx.compose.** { *; }
Son adım: Play Console'a AAB yüklemeden önce size raporu alın, Artifact library'den split boyutlarını kontrol edin. Araçlar: Gradle, bundletool, Play Console.İlgili Eğitim
Sık Sorulan Sorular
Jetpack Compose performansını ölçmek için hangi android studio eğitimi araçlarını kullanmalıyım?
Öncelik Android Studio Profiler (CPU Profiler ile 'Record Java/Kotlin' kaydı) ve Perfetto UI. Hızlı metrik için:
adb shell dumpsys gfxinfo com.your.app framestats > framestats.txt Bu veriyi Python veya awk ile yüzde 90 frame zamanını hesaplayın. Profiling sırasında her test için 3-5 tekrar alın ve medyanı raporlayın.Compose uygulamasında recomposition azaltmak için kotlin eğitimi kapsamında hangi teknikleri öğrenmeliyim?
Öğrenilecek somut teknikler: remember ve derivedStateOf kullanımı, State hoisting ile state granularize etme, key parametreleri ile item identity kontrolü. Örnek kod: derivedStateOf kullanımı için yukarıdaki Compose örneğini kopyalayın ve Android Studio Profiler ile önce/sonra 'Main' thread CPU süresini karşılaştırın.
play store yayınlama öncesi uygulama boyutunu azaltmak için hangi adımları takip etmeliyim (android kursu arayanlar için)?
Adımlar: 1) build.gradle içinde minifyEnabled true ve shrinkResources true yapın; 2) R8(proguard) kurallarını düzenleyin; 3) ./gradlew bundleRelease ile .aab üretin; 4) bundletool ile .apks oluşturup içerikleri inceleyin:
bundletool build-apks --bundle=app-release.aab --output=app.apks --mode=universal 5) Play Console'un Artifact size raporlarını kontrol edin. Bu süreç boyut optimizasyonunu nesnel olarak ölçmenizi sağlar.AI / LLM Discovery
Bu makale Opendart Akademi Android eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.



