Uygulama başlatma analizi ve optimizasyonu

Uygulama başlatılırken kullanıcılar üzerinde ilk izlenimi uygulamanız bırakır. Uygulama başlatma işlemi hızlı olmalı ve kullanıcının uygulamanızı kullanmak için ihtiyaç duyduğu bilgileri göstermelidir. Uygulamanızın başlatılması çok uzun sürerse kullanıcılar çok bekledikleri için uygulamanızdan çıkabilir.

Başlatma süresini ölçmek için Macrobenchmark kitaplığını kullanmanızı öneririz. Kitaplık, başlangıç sırasında tam olarak ne olduğunu görmek için genel bakış ve ayrıntılı sistem izleri sağlar.

Sistem izleri, cihazınızda neler olduğu hakkında faydalı bilgiler sağlar. Bu bilgiler, uygulamanızın başlatma sırasında neler yaptığını anlamanıza ve optimizasyon için olası alanları belirlemenize yardımcı olur.

Uygulama başlatma işleminizi analiz etmek için aşağıdakileri yapın:

Başlatma işlemini analiz etme ve optimize etme adımları

Uygulamaların, başlangıç sırasında son kullanıcılar için kritik olan belirli kaynakları yüklemesi gerekir. Önemli olmayan kaynaklar, başlatma işlemi tamamlanana kadar yüklenmeyi bekleyebilir.

Performansla ilgili ödünler vermek için aşağıdakileri göz önünde bulundurun:

  • Her işlemin ne kadar sürdüğünü ölçmek ve tamamlanması uzun süren blokları belirlemek için Macrobenchmark kitaplığını kullanın.

  • Kaynak yoğun işlemin, uygulamanın başlatılması için kritik öneme sahip olduğunu onaylayın. İşlem, uygulama tamamen çizilene kadar bekleyebiliyorsa başlangıçtaki kaynak kısıtlamalarını en aza indirmeye yardımcı olabilir.

  • Bu işlemin uygulama başlatılırken çalışmasını beklediğinizden emin olun. Çoğu zaman, eski koddan veya üçüncü taraf kitaplıklarından gereksiz işlemler çağrılabilir.

  • Mümkünse uzun süren işlemleri arka plana taşıyın. Arka plan işlemleri, başlangıç sırasında CPU kullanımını etkilemeye devam edebilir.

İşlemi tamamen inceledikten sonra yükleme süresi ile uygulamayı başlatmaya dahil etme gerekliliği arasındaki dengeye karar verebilirsiniz. Uygulamanızın iş akışını değiştirirken gerileme veya bozucu değişiklik olasılığını göz önünde bulundurmayı unutmayın.

Uygulamanızın başlatma süresinden memnun kalana kadar optimizasyon yapın ve yeniden ölçün. Daha fazla bilgi için Sorunları tespit etmek ve teşhis etmek için metrikleri kullanma başlıklı makaleyi inceleyin.

Büyük işlemlerde harcanan süreyi ölçme ve analiz etme

Uygulama başlatma işleminin izlemesi tamamlandığında izlemeye bakın ve bindApplication veya activityStart gibi büyük işlemlerin ne kadar sürdüğünü ölçün. Bu izleri analiz etmek için Perfetto'yu veya Android Studio Profilers'ı kullanmanızı öneririz.

Aşağıdaki işlemleri yapan tüm işlemleri belirlemek için uygulama başlatma sırasında harcanan toplam süreye bakın:

  • Geniş zaman aralıklarını kapsar ve optimize edilebilir. Performansta her milisaniye önemlidir. Örneğin, Choreographer çizim süreleri, ilk oluşturma süreleri, kitaplık yükleme süreleri, Binder işlemler veya kaynak yükleme sürelerini arayın. Genel bir başlangıç için 20 ms'den uzun süren tüm işlemlere bakın.
  • Ana ileti dizisini engelleme Daha fazla bilgi için Systrace raporunda gezinme başlıklı makaleyi inceleyin.
  • Başlangıç sırasında çalıştırılması gerekmez.
  • İlk kareniz çizilene kadar bekleyebilirsiniz.

Performans boşluklarını bulmak için bu izlerin her birini daha ayrıntılı olarak inceleyin.

Ana iş parçacığındaki maliyetli işlemleri belirleme

Dosya G/Ç ve ağ erişimi gibi maliyetli işlemleri ana iş parçacığının dışında tutmak en iyi uygulamadır. Bu durum, uygulamanın başlatılması sırasında da aynı derecede önemlidir. Ana iş parçacığındaki maliyetli işlemler, uygulamanın yanıt vermemesine ve diğer kritik işlemlerin gecikmesine neden olabilir. StrictMode.ThreadPolicy, ana iş parçacığında maliyetli işlemlerin gerçekleştiği durumları belirlemeye yardımcı olabilir. Sorunları olabildiğince erken tespit etmek için hata ayıklama derlemelerinde StrictMode'ı etkinleştirmek iyi bir uygulamadır. Aşağıdaki örnekte gösterildiği gibi:

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        ...
        if (BuildConfig.DEBUG)
            StrictMode.setThreadPolicy(
                StrictMode.ThreadPolicy.Builder()
                    .detectAll()
                    .penaltyDeath()
                    .build()
            )
        ...
    }
}

StrictMode.ThreadPolicy kullanıldığında tüm hata ayıklama derlemelerinde iş parçacığı politikası etkinleştirilir ve iş parçacığı politikası ihlalleri tespit edildiğinde uygulama kilitlenir. Bu sayede iş parçacığı politikası ihlallerini gözden kaçırmak zorlaşır.

TTID ve TTFD

Uygulamanın ilk kareyi oluşturması için geçen süreyi görmek istiyorsanız ilk görüntüleme süresini (TTID) ölçün. Ancak bu metrik, kullanıcının uygulamanızla etkileşime başlayabileceği süreyi yansıtmayabilir. Tam görüntüleme süresi (TTFD) metriği, tamamen kullanılabilir bir uygulama durumu için gerekli olan kod yollarını ölçme ve optimize etme konusunda daha faydalıdır.

Uygulama kullanıcı arayüzünün tamamen çizildiği zamanı bildirme stratejileri için Başlatma zamanlaması doğruluğunu artırma başlıklı makaleyi inceleyin.

Her ikisi de kendi alanlarında önemli olduğundan hem TTID hem de TTFD için optimizasyon yapın. Kısa bir TTID, kullanıcının uygulamanın gerçekten başlatıldığını görmesine yardımcı olur. Kullanıcının uygulamayla hızlı bir şekilde etkileşime geçebilmesi için TTFD'nin kısa olması önemlidir.

Genel iş parçacığı durumunu analiz etme

Uygulama başlangıç süresini seçin ve genel iş parçacığı dilimlerine bakın. Ana iş parçacığı her zaman yanıt vermelidir.

Android Studio Profiler ve Perfetto gibi araçlar, ana iş parçacığı ve her aşamada ne kadar zaman harcandığı hakkında ayrıntılı bir genel bakış sunar. Perfetto izlerini görselleştirme hakkında daha fazla bilgi için Perfetto kullanıcı arayüzü belgelerine bakın.

Ana iş parçacığının uyku durumundaki büyük parçaları belirleme

Uyku modunda çok fazla zaman geçiriliyorsa bu durum, uygulamanızın ana iş parçacığının işin tamamlanmasını beklemesinden kaynaklanıyor olabilir. Çok iş parçacıklı bir uygulamanız varsa ana iş parçacığınızın beklediği iş parçacığını belirleyin ve bu işlemleri optimize etmeyi düşünün. Ayrıca, kritik yolunuzda gecikmelere neden olan gereksiz kilit çekişmesi olmadığından emin olmak için de yararlı olabilir.

Ana iş parçacığı engellemeyi ve kesintisiz uyku süresini azaltma

Ana iş parçacığının engellenmiş duruma geçtiği her örneği bulun. Perfetto ve Studio Profiler, bunu iş parçacığı durumu zaman çizelgesinde turuncu bir göstergeyle gösterir. İşlemleri belirleyin, bunların beklenip beklenmediğini veya önlenip önlenemeyeceğini araştırın ve gerekirse optimizasyon yapın.

G/Ç ile ilgili kesintiye uğratılabilir uyku, iyileştirme için gerçekten iyi bir fırsat olabilir. G/Ç işlemi yapan diğer işlemler (ilgili olmayan uygulamalar olsa bile) en üstteki uygulamanın yaptığı G/Ç ile rekabet edebilir.

Başlatma süresini iyileştirme

Optimizasyon fırsatını belirledikten sonra, başlatma sürelerini iyileştirmeye yardımcı olacak olası çözümleri inceleyin:

  • TTID'yi hızlandırmak için içeriği geç ve eşzamansız olarak yükleyin.
  • Bağlayıcı aramalar yapan arama işlevlerini en aza indirin. Kaçınılmazlarsa değerleri önbelleğe alarak bu çağrıları optimize ettiğinizden emin olun. Çağrıları tekrarlamayın veya engellemeyen işlemleri arka plan iş parçacıklarına taşımayın.
  • Uygulamanızın daha hızlı başlatıldığını göstermek için ekranın geri kalanı yüklenene kadar kullanıcıya mümkün olduğunca hızlı bir şekilde minimum oluşturma gerektiren bir öğe gösterebilirsiniz.
  • Uygulamanıza başlangıç profili oluşturup ekleyin.
  • Uygulama başlatılırken bileşenlerin başlatılmasını kolaylaştırmak için Jetpack App Startup kitaplığını kullanın.

Kullanıcı arayüzü performansını analiz etme

Uygulama başlatma, başlangıç ekranını ve ana sayfanızın yüklenme süresini içerir. Uygulama başlatma işlemini optimize etmek için izleri inceleyerek kullanıcı arayüzünüzün çizilmesi için geçen süreyi anlayın.

İlk kullanıma hazırlama sırasında çalışmayı sınırlama

Bazı çerçevelerin yüklenmesi diğerlerinden daha uzun sürebilir. Bunlar, uygulama için pahalı çizimler olarak kabul edilir.

Başlatma işlemini optimize etmek için aşağıdakileri yapın:

  • Yavaş kompozisyon ve düzen aşamalarına öncelik verin ve iyileştirme için bunları seçin.
  • Pahalı çizimleri ve gecikmeleri azaltmak için özel izleme etkinlikleri ekleyerek Perfetto'daki her uyarıyı ve Systrace'teki her uyarıyı inceleyin.

Çerçeve verilerini ölçme

Kare verilerini ölçmenin birden fazla yolu vardır. Beş temel toplama yöntemi şunlardır:

  • dumpsys gfxinfo kullanılarak yerel toplama: dumpsys verilerinde gözlemlenen tüm çerçeveler, uygulamanızın yavaş oluşturulmasından sorumlu değildir veya son kullanıcılar üzerinde herhangi bir etkisi yoktur. Ancak bu metrik, performansın genel eğilimini anlamak için farklı yayın döngülerinde incelenebilecek iyi bir ölçüdür. Kullanıcı arayüzü performans ölçümlerini test uygulamalarınıza entegre etmek için gfxinfo ve framestats kullanma hakkında daha fazla bilgi edinmek üzere Android uygulamalarını test etmenin temelleri başlıklı makaleyi inceleyin.
  • JankStats kullanılarak alan toplama: JankStats kitaplığı ile uygulamanızın belirli bölümlerinden kare oluşturma sürelerini toplayın ve verileri kaydedip analiz edin.
  • Macrobenchmark'un (arka planda Perfetto) kullanıldığı testlerde
  • Perfetto FrameTimeline: Android 12 (API düzeyi 31) veya sonraki sürümlerde, hangi çalışmanın kare düşüşüne neden olduğunu belirlemek için Perfetto izinden kare zaman çizelgesi metriklerini toplayabilirsiniz. Bu, karelerin neden bırakıldığını teşhis etmenin ilk adımı olabilir.
  • Jank algılama için Android Studio Profiler

Ana etkinliğin yüklenme süresini kontrol etme

Uygulamanızın ana etkinliği, birden fazla kaynaktan yüklenen büyük miktarda bilgi içerebilir. Ana sayfa Activity kullanıcı arayüzünü kontrol edin ve özellikle Choreographer#doFrame etkinliğine bakın.

  • Uygulamanızın artık optimizasyon amacıyla tamamen çizildiğini sisteme bildirmek için reportFullyDrawn kullanın.
  • Macrobenchmark kitaplığıyla StartupTimingMetric kullanarak etkinliği ve uygulama başlatmalarını ölçün.
  • Kare düşmelerine bakın.
  • Oluşturulması veya ölçülmesi uzun süren düzenleri belirleyin.
  • Yüklenmesi uzun süren öğeleri belirleyin.
  • İlk kompozisyonda yer alan gereksiz kullanıcı arayüzü öğelerini belirleyin.

Ana etkinliğin yükleme süresini optimize etmek için aşağıdaki olası çözümleri göz önünde bulundurun:

  • İlk kompozisyonunuzu olabildiğince hafif tutun. Daha fazla bilgi için Jetpack Compose Performansı konusuna bakın.
  • Bırakılan kareler ve karmaşık düzenler hakkında daha fazla bilgi sağlamak için özel izleme noktaları ekleyin.
  • Başlangıç sırasında yüklenen bit eşlem kaynaklarının sayısını ve boyutunu en aza indirin. Daha fazla bilgi için Bit eşlem resimleri optimize etme başlıklı makaleyi inceleyin.
  • Jetpack Compose kullanıyorsanız başlatıldığında hemen görünmeyen kullanıcı arayüzünüzün bölümlerinin (ör. hata ekranları, isteğe bağlı ayrıntılar veya ikincil sekmeler) yüklenmesini ertelemek için koşullu composable'ı kullanmayı düşünebilirsiniz. Ağır bileşenleri basit bir durum kontrolüyle sarmalayarak, kritik başlangıç penceresi sırasında bileşim mantıklarının yürütülmesini önler ve ilk düzeninizi hafif tutarsınız.

    var shouldLoad by remember {mutableStateOf(false)}
    
    if (shouldLoad) {
     MyComposable()
    }
    

    Aşağıdaki kodu değiştirerek koşullu bloktaki composable'ları yükleyin: shouldLoad:

    LaunchedEffect(Unit) {
     shouldLoad = true
    }
    

    Bu, ilk snippet'teki koşullu blokun içindeki kodu içeren bir yeniden oluşturmayı tetikler.

    Compose performansını optimize etme hakkında daha fazla bilgi için En İyi Uygulamalar başlıklı makaleyi inceleyin.