• 30.10.2026 03:06:36
  • İbrahim Gökyar

Jetpack Compose uygulamalarında soğuk başlatmayı hızlandırmak için baseline profile oluşturma, ProfileInstaller entegrasyonu ve ölçümlü karşılaştırma adımları. kotlin eğitimi ve android eğitim bağlamında uygulanabilir, ölçülebilir rehber.

Baseline profile ile Jetpack Compose soğuk başlatma optimizasyonu - Android eğitimi

Neden baseline profile - Jetpack Compose ve Android MVVM mimarisi bağlamında

Baseline profile'ın mekanizması: ART, uygulama çalışırken hangi metodların sıcak olduğunu belirler ve JIT/AOT kararlarını buna göre verir; baseline profile ile önemli Activity/Composable/metodları işaretleyerek cihazın uygulamayı ilk yüklediği arka plan derlemelerinde (profile-guided compilation) bu yöntemlerin önden derlenmesini sağlarsınız. Ölçüm aracı olarak Android Studio Profiler yerine 'adb shell am start -S -W' ile toplam başlangıç süresini sayısal olarak kaydedin ve Perfetto/System Trace ile CPU ve binder gecikmelerini doğrulayın.

Somut araçlar: ART davranışını net görmek için simpleperf ve Android Studio System Trace kullanın. Örnek: uygulama paket adınız com.example.app ise soğuk başlatma için ölçümü şöyle alın:

adb shell am force-stop com.example.app
for i in {1..10}; do adb shell am start -S -W -n com.example.app/.MainActivity | grep TotalTime | awk '{print $2}'; done
Bu çıktıların medyanını alın; baseline profile uygulandıktan sonra aynı prosedürü tekrar ederek yüzde ile kazancı hesaplayın (ör. (beforeMedian-afterMedian)/beforeMedian*100).

Macrobenchmark ile baseline profile oluşturma (kotlin eğitimi uygulamalı örnek)

Baseline profile'ı güvenilir oluşturmanın en güvenli yolu, release yapı üzerinde Macrobenchmark ile gerçek kullanıcı akışını kaydetmektir. Gradle'e eklemeniz gereken bağımlılıklar ve test sınıfı örneği (sürüm numarası belirtmeden artefakt isimleri):

// app/build.gradle
androidTestImplementation 'androidx.benchmark:benchmark-macro'
androidTestImplementation 'androidx.test:runner'
Macrobenchmark testinin minimal Kotlin örneği:

package com.example.benchmark

import androidx.benchmark.macro.MacrobenchmarkRule
import androidx.benchmark.macro.collectBaselineProfile
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
    @get:Rule
    val benchmarkRule = MacrobenchmarkRule()

    @Test
    fun generateBaseline() = benchmarkRule.collectBaselineProfile(
        packageName = "com.example.app"
    ) {
        // uygulamayı başlat ve kritik akışı çalıştır
        pressHome()
        startActivityAndWait()
        // örnek: giriş ekranı -> ana ekrana navigation
        device.waitForIdle()
        // gerektiğinde UI etkileşimleri simüle edin
    }
}
Bu testi release yapı ile çalıştırın:
./gradlew :app:connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabled=true
Test sonucu app/module altında oluşturulan baseline profile'ı alın ve app/src/main/baseline-prof/ içine taşıyın.

Uygulamaya entegre etme ve Play Store yayınlama için pratik adımlar (play store yayınlama, android kursu ilişkisi)

ProfileInstaller entegrasyonu: ProfileInstaller kütüphanesini ekleyip, oluşturduğunuz baseline profile'ı uygulamanın kaynaklarına koyarak cihazda veya Play Store üzerinden profile installer ile kurulmasını sağlayın. Gradle bağımlılığı örneği (versiyon belirtmeden artefakt adı):

implementation 'androidx.profileinstaller:profileinstaller'
Baseline dosyasını paketlemek için dosyayı app/src/main/baseline-prof/ dizinine koyun. Ardından release AAB üretin:
./gradlew bundleRelease
Üretilen .aab'yi bundletool ile kontrol etmek için:
java -jar bundletool.jar dump --bundle=app-release.aab --output=baseline-inspect.txt
Play Console'a yüklediğinizde Play'in profile installer mekanizmasının çalışması için baseline profile'ı AAB içinde paketlemiş olun.

Dikkat edilmesi gerekenler: Baseline profile'ı debug değil, obfuscation/R8 uygulanan release APK/AAB üzerinde üretin; aksi takdirde method isimleri farklı olacağından profile işe yaramaz. Eğer R8 kullanıyorsanız baseline profilini üretirken R8 shrinker'ın uygulandığı birebir aynı build konfigürasyonunu kullanın. Ayrıca çok geniş bir profile (binlerce method) eklemek compile süresini ve cihazda derleme maliyetini artırabilir; hedef yalnızca başlangıç/ilk etkileşim yollarındaki sıcak metodlardır.

Profiling, ölçümlü karşılaştırma ve üretim sonrası izleme (android studio eğitimi, mobil uygulama geliştirme eğitimi)

Ölçüm yöntemi - tutarlı deney: soğuk başlatma (force-stop ile), 10-30 tekrar, medyan alın. Shell script örneği ile otomatikleştirip sonuçların istatistiğini alın:

# measure_cold_start.sh
PKG=com.example.app
adb shell am force-stop $PKG
for i in $(seq 1 15); do
  adb shell am start -S -W -n $PKG/.MainActivity | grep TotalTime | awk '{print $2}'
done | sort -n | awk 'NR==8{print "median="$1}'
Bu sayısal yöntemi baseline öncesi ve sonrası aynı cihaz/aynı yapılandırma ile çalıştırarak karşılaştırın.

Detaylı izleme: ilk frame jank ve CPU dağılımı için Android Studio -> More Tools -> System Trace kullanın veya perfetto ile capture alıp UI Thread, RenderThread, JIT işçilik sürelerini inceleyin. CPU sampling için simpleperf kullanımı:

adb shell pidof com.example.app
adb shell simpleperf record -p  --duration 10 -o /data/local/tmp/perf.data
adb pull /data/local/tmp/perf.data .
simpleperf report -i perf.data
Bu rapor JIT tarafından ne kadar CPU tüketildiğini gösterir; baseline profil ile JIT yükünün düştüğünü gözlemlersiniz.

Yayın sonrası telemetri: Play Console'ın ANR/crash ve Android vitals raporlarına ek olarak uygulama kendi içinde startup timing telemetri (ör. Firebase Performance veya özel eventi) göndererek cihaz grupları (CPU/ABI) bazında gainleri takip edin. Örnek event: sendMetric("cold_start_ms", measuredMs, mapOf("abi" to abi))

Edge case'ler, yaygın hatalar ve iyi uygulamalar (android mvvm mimarisi ile uyum)

Yaygın hata: baseline profile'ı debug APK ile üretip release'e koymak. Çözüm: macrobenchmark ile mutlaka release (R8/shrink) yapı üzerinde kayıt alın. Ayrıca modular projelerde tek profile tüm modülleri kapsamaz; feature/module başına kritik yollar için ayrı baseline profile üretip module kaynaklarına koyun.

Best practice: Jetpack Compose kullanırken Composable fonksiyon isimleri ve lambda'lar inline edildiği için profil dosyasında doğru noktalara referans verildiğinden emin olun. UI başlangıç akışı için activity->viewmodel->composable zincirindeki sıcak metodları hedefleyin. Eğer ViewModel başlatma maliyeti yüksekse (veri çeken coroutine), startup sırasında veri yükünü erteleyin veya on-demand yapıp baseline'a yalnızca gerekli init metodlarını ekleyin.

Proguard/R8 ile ilgili incelik: obfuscation sonrası isimler değişir; baseline profil üretimini release build (aynı R8 konfigürasyonu) ile yapılmış APK üzerinde gerçekleştirirseniz profile eşleşir. Ayrıca baseline profili çok geniş tutmak cihazda bytes ve derleme maliyeti artırır - sadece ilk 1-3 ekranın yollarını hedefleyin.

Sık Sorulan Sorular

Baseline profile ile Jetpack Compose uygulamamın soğuk başlatması nasıl ölçülür, android eğitimi örneği?

Soğuk başlatma ölçümü için önce adb ile uygulamayı force-stop yapın, ardından 10-15 defa 'adb shell am start -S -W -n com.example.app/.MainActivity' çalıştırın ve TotalTime değerlerinin medyanını alın. Baseline profile öncesi ve sonrası aynı scripti çalıştırıp yüzde kazancı hesaplayın. Ayrıca System Trace veya simpleperf kullanarak CPU/JIT aktivitesini doğrulayın.

Kotlin ile yazılmış Compose projesinde baseline profile nasıl üretilir, kotlin eğitimi kapsamında pratik adımlar neler?

Macrobenchmark kütüphanesi ile release yapı üzerinde gerçek UI akışını kaydedin. Yukarıdaki Kotlin örnek test sınıfını kullanarak baseline profil oluşturun, oluşturulan profile dosyasını app/src/main/baseline-prof/ dizinine taşıyın ve profileinstaller kütüphanesini ekleyin. Release AAB oluşturup Play Console'a yükledikten sonra Play'in profile installer mekanizması ile cihazlarda profile kullanımı sağlanır.

Play Store yayınlama sırasında baseline profile eklemek uygulama boyutunu etkiler mi ve android kursu bağlamında nelere dikkat etmeliyim?

Evet, baseline profile küçük bir ek boyut getirir fakat doğru optimize edildiğinde faydası çok daha büyüktür. Önemli olan profile'ı minimal tutmak; yalnızca ilk başlatma ve kritik etkileşimler için metodları ekleyin. Publish öncesi AAB içeriğini 'bundletool' ile kontrol edin ve profile dosyasının paketlendiğini doğrulayın.

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.

Opendart Akademi llms.txt

📚 Bu konuyu Opendart Akademi'de öğrenin: Android Kotlin kursu · Android Kotlin eğitimi hakkında · YouTube video dersleri · Abone ol