Uygulama başlatma analizi ve optimizasyonu

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

Başlatmayı ölçmek için Makrobenchmark kitaplığını kullanmanızı öneririz. Kitaplık, başlatma sırasında tam olarak neler olduğunu görmek için bir genel bakış ve ayrıntılı sistem izlemeleri 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 olası optimizasyon alanlarını belirlemenize yardımcı olur.

Uygulama başlangıcınızı analiz etmek için şunları yapın:

Başlatmayı analiz ve optimize etme adımları

Uygulamaların genellikle başlatma sırasında son kullanıcılar için kritik önem taşıyan belirli kaynakları yüklemesi gerekir. Gerekli olmayan kaynakların yüklenmesi, başlatma işlemi tamamlanana kadar bekleyebilir.

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

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

  • Kaynakları yoğun bir şekilde kullanan işlemin, uygulama başlatma açısından kritik olduğunu onaylayın. İşlem, uygulama tamamen çizilene kadar bekleyebilirse başlangıçta kaynak kısıtlamalarını en aza indirmeye yardımcı olabilir.

  • Uygulama başlatıldığında bu işlemin çalışmasını beklediğinizden emin olun. Gereksiz işlemler genellikle eski koddan veya üçüncü taraf kitaplıklardan çağrılabilir.

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

İşlemi tam olarak araştırdıktan sonra, yükleme süresi ile uygulamayı başlatmanın gerekliliği arasındaki dengeyi belirleyebilirsiniz. Uygulamanızın iş akışını değiştirirken regresyon veya değişiklikleri bozma potansiyelini eklemeyi unutmayın.

Uygulamanızın başlatma süresinden memnun kalana kadar optimizasyon yapın ve yeniden ölçüm yapın. Daha fazla bilgi için Sorunları algılamak ve teşhis etmek için metrikleri kullanma konusuna bakın.

Büyük operasyonlarda harcanan zamanı ölçme ve analiz etme

Uygulama başlatma izleri eksiksiz olduğunda ize bakın ve bindApplication veya activityStart gibi önemli işlemler için harcanan süreyi ölçün. Bu izleri analiz etmek için Perfetto veya Android Studio Profilers'ı kullanmanızı öneririz.

Aşağıdakileri yapan işlemleri belirlemek için uygulama başlatılırken harcanan toplam zamana bakın:

  • Uzun zaman dilimlerini kaplar ve optimize edilebilir. Her milisaniye performans için önemlidir. Örneğin, Choreographer çizim süreleri, düzen enflasyon süreleri, kitaplık yükleme süreleri, Binder işlemleri veya kaynak yükleme sürelerine bakın. Genel bir başlangıç için 20 ms'den uzun süren tüm işlemlere bakın.
  • Ana ileti dizisini engelleyin. Daha fazla bilgi için Systrace raporunda gezinme konusuna göz atın.
  • Başlatma sırasında çalıştırmanız gerekmez.
  • İlk kareniz çizilene kadar bekleyebilir.

Performans eksikliklerini bulmak için bu izlerin her birini daha ayrıntılı şekilde araştırın.

Ana iş parçacığındaki pahalı işlemleri tanımlayın

Dosya G/Ç ve ağ erişimi gibi pahalı işlemleri ana iş parçacığından uzak tutmak en iyi uygulamadır. Ana iş parçacığındaki pahalı işlemler uygulamayı yanıt vermeyebilir ve diğer kritik işlemleri geciktirebileceği için bu işlem, uygulama başlatma sırasında da aynı derecede önemlidir. StrictMode.ThreadPolicy, ana iş parçacığında pahalı işlemlerin gerçekleştiği durumları belirlemenize yardımcı olabilir. Aşağıdaki örnekte gösterildiği gibi, hata ayıklama derlemelerinde StrictMode'i etkinleştirerek sorunları mümkün olduğunca erken tespit etmenizi öneririz:

Kotlin

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

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

Java

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

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

StrictMode.ThreadPolicy kullanımı, tüm hata ayıklama derlemelerinde iş parçacığı politikasını etkinleştirir ve iş parçacığı politikasının ihlal edildiği her tespit edildiğinde uygulamayı kilitler. Bu da ileti dizisi politika ihlallerinin kaçırılmasını zorlaştırır.

TTID ve TTFD

Uygulamanın ilk karesini oluşturması için geçen süreyi görmek için ilk ekran görüntülenene kadar geçen süreyi (TTID) ölçün. Ancak bu metrik, kullanıcının uygulamanızla etkileşimde bulunabilmesi için geçmesi gereken süreyi yansıtmayabilir. Tam görüntüleme süresi (TTFD) metriği, uygulama durumunun tam olarak kullanılabilir olması için gereken kod yollarının ölçülmesi ve optimize edilmesinde daha kullanışlıdır.

Uygulamanın kullanıcı arayüzü tamamen çizildiğinde raporlamayla ilgili stratejiler için Başlangıç zamanlaması doğruluğunu iyileştirme bölümüne bakın.

TTID ve TTFD için optimizasyon yapın, çünkü her ikisi de kendi alanlarında önemlidir. 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 girebilmesini sağlamak için TTFD'yi kısa tutmak önemlidir.

Genel ileti dizisi durumunu analiz etme

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

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ış sağlar. Perfetto izlerini görselleştirme hakkında daha fazla bilgi için Perfetto UI belgelerine bakın.

Ana iş parçacığı uyku durumunun büyük parçalarını tanımlayın

Uykunuzda çok fazla vakit varsa bunun nedeni büyük olasılıkla uygulamanızın ana iş parçacığının işin tamamlanmasını beklemesi olabilir. Çok iş parçacıklı bir uygulamanız varsa ana iş parçanızın beklediği iş parçacığını belirleyin ve bu işlemleri optimize etmeyi düşünün. Kritik yolunuzda gecikmelere neden olan gereksiz kilit anlaşmazlığı olmadığından emin olmak da faydalı olabilir.

Ana iş parçacığı engellemeyi ve kesintisiz uykuyu azaltın

Ana iş parçacığının engellenmiş duruma giden her örneğini kontrol edin. Perfetto ve Studio Profiler, bunu ileti dizisi durumu zaman çizelgesinde turuncu bir göstergeyle gösterir. Operasyonları belirleyin, bunların beklendiğini veya önlenebileceğini keşfedin ve gerektiğinde optimizasyon yapın.

IO ile ilgili kesintili uyku, iyileşme için iyi bir fırsat olabilir. KS yapan diğer işlemler, alakasız uygulamalar olmasalar bile en popüler uygulamanın yaptığı KS ile rekabet edebilir.

Başlatma süresini iyileştirin

Bir optimizasyon fırsatı belirledikten sonra, başlatma sürelerini iyileştirmeye yardımcı olacak olası çözümleri keşfedin:

  • TTID'yi hızlandırmak için içeriği geç ve eşzamansız olarak yükleyin.
  • Bağlayıcı çağrıları yapan işlevleri en aza indirin. Bu durumlar kaçınılmazsa bu çağrıları tekrarlamak veya engellemeyen işleri arka plan iş parçacıklarına taşımak yerine değerleri önbelleğe alarak optimize ettiğinizden emin olun.
  • Uygulama açılışınızın daha hızlı görünmesini sağlamak için, ekranın geri kalanı yüklenmeden önce kullanıcıya, minimum düzeyde oluşturma gerektiren bir şeyi mümkün olan en kısa sürede gösterebilirsiniz.
  • Bir başlangıç profili oluşturup uygulamanıza ekleyin.
  • Uygulama başlatma sırasında bileşenlerin başlatılmasını kolaylaştırmak için Jetpack Uygulama Başlangıç Kitaplığı'nı kullanın.

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

Uygulama başlatılırken, bir başlangıç ekranı ve ana sayfanızın yüklenme süresi yer alır. Uygulama başlatmayı optimize etmek için, kullanıcı arayüzünüzün çizilmesi için geçen süreyi anlamak amacıyla izleri inceleyin.

Başlatma sırasında yapılacak işleri sınırla

Belirli karelerin yüklenmesi diğer karelere göre daha uzun sürebilir. Bunlar, uygulama için pahalı çekimler olarak kabul edilir.

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

  • Yavaş düzen geçişlerine öncelik verin ve iyileştirmeler için bunları seçin.
  • Pahalı çizimleri ve gecikmeleri azaltmak için Perfetto'dan gelen her uyarıyı ve Systrace'ten gelen uyarıları incelemek için özel izleme etkinlikleri ekleyin.

Çerçeve verilerini ölçme

Çerçeve verilerini ölçmenin birden çok yolu vardır. Beş temel veri toplama yöntemi şunlardır:

  • dumpsys gfxinfo kullanarak yerel veri toplama: Dumpsys verilerinde gözlemlenen tüm kareler uygulamanızın yavaş oluşturulmasından sorumlu değildir veya son kullanıcıları etkilemez. Ancak bu, performanstaki genel eğilimi anlamak için farklı sürüm döngülerine bakmak iyi bir ölçümdür. Kullanıcı arayüzü performans ölçümlerini test uygulamalarınıza entegre etmek üzere gfxinfo ve framestats yöntemlerini kullanma hakkında daha fazla bilgi edinmek için Android uygulamalarını test etmenin temelleri sayfasını inceleyin.
  • JankStats kullanarak alan toplama: JankStats kitaplığı ile uygulamanızın belirli bölümlerinden kare oluşturma sürelerini toplayıp verileri kaydedip analiz edin.
  • Makrobenchmark (Ayrıntılı Perfetto) kullanılan testlerde
  • Perfetto FrameTimeline: Android 12'de (API düzeyi 31) bir Perfetto izinden Kare zaman çizelgesi metriklerini toplayarak kare düşüşüne hangi işin neden olduğunu belirleyebilirsiniz. Bu, karelerin neden bırakıldığını teşhis etmenin ilk adımı olabilir.
  • jank algılama için Android Studio Profiler

Ana etkinlik yükleme süresini kontrol etme

Uygulamanızın ana etkinliğinde birden fazla kaynaktan yüklenen büyük miktarda bilgi bulunabilir. Ev Activity düzenini kontrol edin, özellikle de ev etkinliğinin Choreographer.onDraw yöntemine bakın.

  • reportFullyDrawn kullanarak uygulamanızın artık tamamen optimizasyon amacıyla çizildiğini sisteme bildirin.
  • StartupTimingMetric aracını Makrobenchmark kitaplığıyla kullanarak etkinliği ve uygulama lansmanlarını ölçün.
  • Kare düşüşlerine bakın.
  • Oluşturulması veya ölçülmesi uzun süren düzenleri tanımlayın.
  • Yüklenmesi uzun süren öğeleri tanımlayın.
  • Başlatma sırasında şişirilen gereksiz düzenleri tanımlayın.

Ana etkinlik yükleme süresini optimize etmek için şu olası çözümleri göz önünde bulundurun:

  • İlk düzeninizi mümkün olduğunca temel yapın. Daha fazla bilgi için Düzen hiyerarşilerini optimize etme bölümüne bakın.
  • Atlanan kareler ve karmaşık düzenler hakkında daha fazla bilgi sağlamak için özel izleme noktaları ekleyin.
  • Başlatma sırasında yüklenen bit eşlem kaynaklarının sayısını ve boyutunu en aza indirin.
  • Düzenler hemen VISIBLE değilse ViewStub kullanın. ViewStub, çalışma zamanında düzen kaynaklarını geç şişirmek için kullanılabilecek görünmez, sıfır boyutlu bir görünümdür. Daha fazla bilgi için ViewStub sayfasını inceleyin.

    Jetpack Compose'u kullanıyorsanız bazı bileşenlerin yüklenmesini ertelemek için durum özelliğini kullanarak ViewStub ile benzer bir davranış elde edebilirsiniz:

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

    shouldLoad öğesini değiştirerek, koşullu blokun içindeki oluşturulabilir öğeleri yükleyin:

    LaunchedEffect(Unit) {
     shouldLoad = true
    }
    

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