Uygulama başlatma süresi

Kullanıcılar uygulamaların hızlı yüklenmesini ve duyarlı olmasını bekler. Başlangıç zamanı yavaş olan bir uygulama bu beklentiyi karşılamıyor ve kullanıcıları hayal kırıklığına uğratabiliyor. Bu tür fakir bir kullanıcı uygulamanızı Play Store'da kötü puanlayabilir, hatta uygulamanızdan tamamen vazgeçmenize neden olabilir.

Bu sayfada, uygulamanızın lansman zamanını optimize etmenize yardımcı olacak bilgiler yer alır. ve lansman sürecinin dahili bileşenlerine genel bir bakış, ve başlangıç zamanıyla ilgili bazı yaygın sorunlar hakkında bilgi edineceksiniz. bunları ele alın.

Farklı uygulama başlatma durumlarını anlama

Uygulama şu üç durumdan birinde gerçekleşebilir: baştan başlatma, hazır durumda başlatma veya hazır durumda başlatma başlatabilirsiniz. Her eyalet, uygulamanızın görünür hale gelmesinin ne kadar süreceğini etkiler temsil eder. Soğuk başlatma sırasında, uygulamanız sıfırdan başlar. Diğer eyaletlerde, sistemin çalışan uygulamayı arka plandan ön plana getirmesi gerekir.

Her zaman baştan başlatma varsayımına göre optimizasyon yapmanızı öneririz. Bu şekilde, hazır ve çalışır durumda başlatma performansı da artabilir.

Uygulamanızı hızlı başlatma için optimize etmek amacıyla, gerçekleştiğine ve bunların her birinde nasıl etkileşime eyaletler.

Uygulama başlatmayı belirleyen iki önemli metrik, ilk ekran görüntülenene kadar geçen süredir (TTID) ve tamamen çizim süresi (TTFD). TTID, ilk kareyi görüntüler. TTFD ise uygulamanın görünmesi için gereken süreyi ifade eder. ve tamamen etkileşimlidir. Her ikisi de eşit derecede önemlidir çünkü TTID, kullanıcının uygulamanın yüklendiğini gösterir. TTFD, uygulamanın gerçekten kullanılabilir olduğu zamanı ifade eder. İkisinden biri kullanıcı uygulamanız çok uzunsa uygulamanızdan tam olarak yüklenmeden çıkış yapabilir.

Soğuk başlatma

Soğuk başlatma, bir uygulamanın sıfırdan başlamasını ifade eder. Bu durumda, uygulamanın sürecini, sistem tarafından oluşturulduğundan emin olun. Baştan başlamazlar Örneğin, cihaz başlatıldıktan sonra uygulamanızın ilk kez başlatılması veya sistem uygulamayı sonlandırdığından emin olun.

Bu tür bir başlangıç, başlatma süresini kısaltmanın en büyük zorluğunu getirir. Çünkü sistem ve uygulamanın yapması gereken işler diğer başlatma durumlarına kıyasla daha fazladır.

Soğuk başlatmanın başında, sistem aşağıdaki üç görevi yerine getirir:

  1. Uygulamayı yükleyip başlatın.
  2. Lansmandan hemen sonra uygulama için boş bir başlangıç penceresi görüntüleyin.
  3. Uygulama işlemini oluşturun.

Sistem, uygulama işlemini oluşturur oluşturmaz uygulama süreci sorumlu olur bir sonraki aşamaya geçeceksiniz:

  1. Uygulama nesnesini oluşturun.
  2. Ana ileti dizisini başlatın.
  3. Ana etkinliği oluşturun.
  4. Görüntüleme sayısını artırma.
  5. Ekranın düzenini sağlama.
  6. İlk çizimi yap.

Uygulama işlemi ilk çizimi tamamladığında sistem, uygulamadaki ana etkinlikle değiştirerek görüntülenen arka plan penceresini görebilirsiniz. Bu noktada uygulamayı kullanmaya başlayabilir.

Şekil 1'de, sistem ve uygulamanın aktarım işlerinin her bir diğer.

Şekil 1. Planlama aşamasının önemli kısımlarının lansman sonrasında gerçekleşebilir.

Uygulamanın oluşturulması ve oluşturulması sırasında performans sorunları ortaya çıkabilir. etkinliği'ne dokunun.

Uygulama oluşturma

Uygulamanız başlatıldığında, boş başlangıç penceresi Uygulama çizimini ilk kez tamamlar. Bu noktada, sistem işlemi, uygulamanızın başlangıç penceresini değiştirerek kullanıcının etkileşimde bulunmasını sağlar inceleyebilirsiniz.

Kendi uygulamanızda Application.onCreate() özelliğini geçersiz kılarsanız sistem uygulama nesnenizde onCreate() yöntemini çağırır. Daha sonra uygulama ortaya çıkıyor. UI iş parçacığı olarak da bilinen ana iş parçacığı ve üzerinde ana aktivitedir.

Bu noktadan itibaren, sistem ve uygulama düzeyindeki işlemler uygulama yaşam döngüsü aşamalarına göz atın.

Etkinlik oluşturma

Uygulama işlemi etkinliğinizi oluşturduktan sonra etkinlik aşağıdaki işlemleri gerçekleştirir: işlemler:

  1. Değerleri başlatır.
  2. Oluşturucuları çağırır.
  3. Activity.onCreate() gibi uygun bir geri çağırma yöntemini çağırır. etkinliğin mevcut yaşam döngüsü durumuna

Genellikle onCreate() yöntemi, yükleme süresi üzerinde en büyük etkiye sahiptir. çünkü en yüksek ek yük ile işi yapar: yükleme ve şişirme görünümlerini oluşturmak ve etkinliğin çalışması için gereken nesneleri başlatmak.

Hazır durumda başlatma

Hazır başlangıç, bir aşama sırasında gerçekleştirilen işlemlerin bir alt kümesini baştan başlatma. Aynı zamanda, çalışır durumda başlatmadan daha fazla genel gideri temsil eder. Hazır durumda başlatma olarak değerlendirilebilecek birçok olası durum vardır; takip etmek için:

  • Kullanıcı, uygulamanızdan çıkıp uygulamayı yeniden başlatırsa. Süreç, bir sonraki çalışmaya devam etmesi gerekir, ancak uygulama, yeni bir API kullanarak etkinliği onCreate() numaralı telefona sesli arama yapın.

  • Sistem, uygulamanızı bellekten çıkarır ve ardından kullanıcı yeniden başlatır. İlgili içeriği oluşturmak için kullanılan sürecin yeniden başlatılması gerekir ancak görev biraz avantaj sağlayabilir onCreate() içine aktarılan kaydedilmiş örnek durumu paketinden alınır.

Çalışır durumda başlatma

Uygulamanızın çalışır durumda başlatma işleminde, baştan başlatmaya göre daha az genel işlem bulunur. Çalışır durumdayken, sistem, etkinliğinizi ön plana çıkarır. Uygulamanızın tüm etkinlikler bellekte kalmaya devam ederse uygulama, nesnenin tekrarlanmasını önleyebilir başlatma, düzeni şişirme ve oluşturma.

Bununla birlikte, onTrimMemory() içeriyorsa bu nesnelerin açın.

Çalışır durumda başlatma, baştan başlatma senaryosuyla aynı ekranda çalışma biçimini gösterir. İlgili içeriği oluşturmak için kullanılan sistem işlemi, uygulamanın görünümü oluşturmayı bitirene kadar boş bir ekran etkinliği'ne dokunun.

Şekil 2. Çeşitli başlatma durumlarını gösteren bir diyagram ve ilgili süreçlerine yer verecek şekilde, her biri ilk kareden başlayarak çizer.

Perfetto'da uygulama startup'ını belirleme

Uygulama başlatma sorunlarını gidermek için tam olarak nelerin dahil edildiğini belirlemek faydalıdır. aşamasındayız. Uygulama başlatma aşamasının tamamını Perfetto, aşağıdaki adımları uygulayın:

  1. Perfetto'da, Android Uygulama Startup'larından türetilmiş metriğin bulunduğu satırı bulun. Eğer adı görmüyorsanız cihaz üzerinde sistem izlemeyi kullanarak uygulamasında gösterilir.

    Şekil 3.Android Uygulaması Başlatmaları, türetilmiş metrik dilimi Perfetto.
  2. İlgili dilimi tıklayın ve dilimi seçmek için m tuşuna basın. Dilimin etrafında parantezler görünür ve bunun ne kadar sürdüğünü belirtir. Süre: Geçerli seçim sekmesinde de gösterilir.

  3. Sabitlenen Android Uygulama Girişimleri satırını, sağ taraftaki sabitle simgesini görünür hale getirebilirsiniz.

  4. Söz konusu uygulamanın bulunduğu satıra gidin ve genişletmek için ilk hücreyi tıklayın satıra ekleyin.

  5. w tuşuna basarak genellikle en üstte olan ana ileti dizisini yakınlaştırın (uzaklaştırmak için s, a, d tuşlarına basın, sola hareket ettirin ve sağa gidin, ).

    Şekil 4.Android Uygulama Başlatmaları türetilmiş metrik dilimi uygulamanın ana ileti dizisine bağlanır.
  6. Türetilen metrikler dilimi, rapora tam olarak nelerin dahil edildiğini görmeyi kolaylaştırır hata ayıklamaya daha ayrıntılı şekilde devam edebilirsiniz.

Startup'ları incelemek ve iyileştirmek için metrikleri kullanma

Başlatma süresi performansını doğru şekilde teşhis etmek için, Google Etiket Yöneticisi'nden başlatmanın ne kadar sürdüğünü gösterir. Android, kullanıcıların uygulamanızı ve bunu teşhis etmenize yardımcı olur. Android vitals sizi uyarabilir ve teşhis araçları size yardımcı olabileceği için düşünmeye başlar.

Başlangıç metriklerini kullanmanın avantajları

Android, ilk ekran görüntülenene kadar geçen süreyi (TTID) ve tam ekran süresini kullanır (TTFD) metriklerini kullanır. Android Çalışma Zamanı (ART) Kodu optimizasyon için verimli bir şekilde önceden derlemek amacıyla bu metriklerdeki verileri kullanır. riskleri ele alacağız.

Startup'ların daha hızlı başlatılması, kullanıcıların uygulamanızla etkileşimini daha da sürdürülebilir hale getirir. Erken çıkış, örneği yeniden başlatma veya sayfadan çıkma örneklerini azaltır uygulamayı yükleyin.

Android vitals

Android vitals, sizi Uygulamanızın başlatma süreleri aşırı olduğunda Play Console.

Android vitals, uygulamanız için aşağıdaki başlatma sürelerini aşırı dikkate alır:

  • Cold başlatma işlemi 5 saniye veya daha uzun sürer.
  • Sıcak başlatma işlemi 2 saniye veya daha uzun sürer.
  • Çabuk başlatma işlemi 1,5 saniye veya daha uzun sürer.

Android vitals, ilk ekran görüntülenene kadar geçen süre (TTID) metriğini kullanır. Örneğin, Google Play'in Android vitals verilerini nasıl topladığı hakkında bilgi için bkz. Play Console dokümanları.

İlk ekran görüntülenene kadar geçen süre

İlk ekran görüntülenene kadar geçen süre (TTID), ilk karenin gösterilmesi için gereken süredir. olabilir. Bu metrik, bir uygulamanın baştan başlatma sırasında işlemin başlatılması, etkinlik sırasındaki işlemin soğuk veya sıcak başlatma sırasında oluşturma ve ilk kareyi görüntüleme. Saklanıyor Uygulamanızın TTID'nin düşük olması, kullanıcıların hızlı bir şekilde başlatılmasını sağlar. TTID, Android tarafından her uygulama için otomatik olarak raporlanır Çerçeve. Uygulama başlatma için optimizasyon yaparken, TTFD'ye kadar bilgi almak için reportFullyDrawn.

TTID, ölçümün yapıldığı toplam süreyi temsil eden aşağıdaki etkinlik dizisini içerir:

  • Süreci başlatma.
  • Nesneler başlatılıyor.
  • Etkinliği oluşturma ve başlatma.
  • Düzeni şişirme.
  • Uygulamayı ilk kez çizmek.

TTID kimliğini al

TTID'yi bulmak için Logcat komut satırı aracında bir çıkış satırı arayın Displayed adlı bir değer içerir. Bu değer TTID'dir ve benzer görünür aşağıdaki örneğe dönelim: 3s534 ms.

ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms

Android Studio'da TTID'yi bulmak için Logcat görünümünüzdeki filtreleri devre dışı bırakın: seçin ve ardından Şekil 5'te gösterildiği gibi Displayed zamanını bulun. Uygulama değil sistem sunucusu nedeniyle filtrelerin devre dışı bırakılması gerekir bu günlüğü sunar.

Şekil 5. Devre dışı bırakılan filtreler ve Displayed değerine sahip olduğundan emin olun.

Logcat çıkışındaki Displayed metriği, tüm kaynakların yüklenip görüntülenmemesi için gereken süredir. Uygulama, kaynak olmayan veya uygulamanın bölümüdür. Bu kaynaklar yüklendiğinden hariç tutulur satır içi bir işlemdir ve uygulamanın ilk görüntüsünü engellemez.

Bazen Logcat çıkışındaki Displayed satırı ek bir alan içerir toplam süreyi ifade eder. Örnek:

ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms (total +1m22s643ms)

Bu durumda, ilk ölçüm yalnızca ilk yapılan etkinlik içindir. çizer. total süresi ölçümü, uygulama işlemi başlangıcında başlar ve önce başlatılan ancak diğer kullanıcılara hiçbir şey göstermeyen ekranda görebilirsiniz. total zaman ölçümü yalnızca bir ve toplam başlatma süreleri arasındaki farkı fark edebilirsiniz.

Android Studio'da Logcat'i kullanmanızı öneririz ancak Android kullanmıyorsanız Studio, uygulamanızı adb kabuğuyla çalıştırarak TTID'yi de ölçebilirsiniz. etkinlik yöneticisi komutunu kullanın. Aşağıda bununla ilgili bir örnek verilmiştir:

adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN

Displayed metriği, Logcat çıkışında önceki gibi görünür. Terminaliniz penceresinde şunlar görüntülenir:

Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044
TotalTime: 2044
WaitTime: 2054
Complete

-c ve -a bağımsız değişkenleri isteğe bağlıdır ve <category> belirtmenizi sağlar ve <action>.

Tam gösterime kalan süre

Tam ekran süresi (TTFD), bir uygulamanın kullanıcı için etkileşimlidir. Reklamın görüntülenmesi için geçen süre olarak uygulamanın kullanıcı arayüzünün ilk çerçevesi ve eşzamansız olarak yüklenen içerik sonraki kareyi seçin. Genellikle bu, yüklenen birincil içeriktir (uygulama tarafından bildirildiği şekilde ağ veya diskten) Başka bir deyişle TTFD, TTID ve uygulamanın kullanılabilir hale gelmesi için gereken süre. Uygulamanızın TTFD düşük, kullanıcıların pek çok yolu vardır.

Choreographer, etkinliğin onDraw() yöntemini kullanarak ve bu çağrıyı ilk kez çağırdığını tespit ettiğinde. Ancak her uygulama TTFD'yi ne zaman belirleyeceğini bilemez. biraz farklı davranır. Uygulamanın TTFD'yi belirlemek için sisteme sinyal vermesi gerekir tamamen çizilmiş durumuna ulaştığında.

TTFD'yi al

TTFD'yi bulmak için ComponentActivity için reportFullyDrawn() yöntemi. İlgili içeriği oluşturmak için kullanılan reportFullyDrawn yöntemi, uygulama tamamen çizildiğinde ve kullanılabilir durumda olduğunda bunu bildirir durumu. TTFD, sistemin uygulamanın başlatılmasından itibaren geçen süredir reportFullyDrawn() çağrıldığında ne yapılmalı? Aramazsanız reportFullyDrawn(), TTFD değeri bildirilmez.

TTFD'yi ölçmek için, kullanıcı arayüzünü tamamen çizdikten sonra reportFullyDrawn() işlevini çağırın ve sahip olmayabilir. İlk etkinlik bitmeden reportFullyDrawn() adlı kişiyi aramayın pencere ilk olarak çizilir ve sistem tarafından ölçüldüğü şekilde görüntülenir. Bunun nedeni, sistem, ölçülen süreyi raporlar. Başka bir deyişle, Sistem TTID'yi algılamadan reportFullyDrawn() önce, sistem her ikisini de bildirir TTID ve TTFD, aynı değer olarak kullanılır ve bu değer, TTID değeridir.

reportFullyDrawn() işlevini kullandığınızda Logcat aşağıdakine benzer bir çıkış görüntüler (TTFD'nin 1s54 ms olduğu bir örnek):

system_process I/ActivityManager: Fully drawn {package}/.MainActivity: +1s54ms

Logcat çıkışı bazen bir total zamanı içerir ( ilk ekran.

Görüntüleme süreleriniz istediğinizden yavaşsa, kötü amaçlı yazılımın neden olur.

Temel durumlarda tamamen çizilmiş durumu belirtmek için reportFullyDrawn() kullanabilirsiniz tamamen çizilmiş duruma ulaşıldığını bildiğiniz bir sürüm oluşturun. Ancak, arka plan iş parçacıklarının tamamen çizilmeden önce arka plan çalışmasını durumu gerçekleştirilir, daha doğru bir sonuç için reportFullyDrawn() işlemini ertelemeniz gerekir TTFD ölçümü. reportFullyDrawn() ertelemenin nasıl yapılacağını öğrenmek için aşağıdaki bağlantılara göz atın bölümüne bakın.

Başlatma zamanlaması doğruluğunu iyileştirin

Uygulamanız geç yükleme yapıyorsa ve ilk ekranda Diğer tüm kaynaklardan (ör. uygulamanız ağdan resim getirirken) reportFullyDrawn aramasını, uygulamanız kullanıma sunulana kadar ertelemek isteyebilir liste popülasyonunu karşılaştırmanıza dahil edebilmeniz için kullanılabilirdir zamanlama.

Örneğin, kullanıcı arayüzünde RecyclerView gibi bir dinamik liste varsa ya da tembel liste yerine Liste ilk olarak çizilir ve böylece kullanıcı arayüzü tamamen çizilmiş olarak işaretlendikten sonra. Bu gibi durumlarda, listedeki nüfus karşılaştırmaya dahil edilmez.

Listedeki nüfusu karşılaştırma zamanlamanıza dahil etmek için getFullyDrawnReporter() kullanarak FullyDrawnReporter ve bir bunu uygulama kodunuzda belirtin. Arka plan görevinin ardından bildireni serbest bırakın listeyi doldurur.

FullyDrawnReporter, hepsine kadar reportFullyDrawn() yöntemini çağırmaz eklenen muhabirler serbest bırakılır. Arka plan işlemine kadar bir bildiren ekleyerek zamanlamalar, formun doldurulması için gereken süreyi de listesi oluşturun. Bu, uygulamanın ancak zamanlama başlangıç verilerinin doldurulması için gereken süreyi içermesine izin verir liste dışı bırakmalısınız. Tüm görevler tamamlanana kadar reportFullyDrawn() çağrılmaz tamamlanan sonuçlar bulunur.

Aşağıdaki örnekte, birden fazla arka plan görevini nasıl çalıştırabileceğiniz gösterilmektedir (her biri kendi muhabirini kaydettirmek üzere)

Kotlin

class MainActivity : ComponentActivity() {

    sealed interface ActivityState {
        data object LOADING : ActivityState
        data object LOADED : ActivityState
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            var activityState by remember {
                mutableStateOf(ActivityState.LOADING as ActivityState)
            }
            fullyDrawnReporter.addOnReportDrawnListener {
                activityState = ActivityState.LOADED
            }
            ReportFullyDrawnTheme {
                when(activityState) {
                    is ActivityState.LOADING -> {
                        // Display the loading UI.
                    }
                    is ActivityState.LOADED -> {
                        // Display the full UI.
                    }
                }
            }
            SideEffect {
                lifecycleScope.launch(Dispatchers.IO) {
                    fullyDrawnReporter.addReporter()

                    // Perform the background operation.

                    fullyDrawnReporter.removeReporter()
                }
                lifecycleScope.launch(Dispatchers.IO) {
                    fullyDrawnReporter.addReporter()

                    // Perform the background operation.

                    fullyDrawnReporter.removeReporter()
                }
            }
        }
    }
}

Java

public class MainActivity extends ComponentActivity {
    private FullyDrawnReporter fullyDrawnReporter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        fullyDrawnReporter = getFullyDrawnReporter();
        fullyDrawnReporter.addOnReportDrawnListener(() -> {
            // Trigger the UI update.
            return Unit.INSTANCE;
        });

        new Thread(new Runnable() {
            @Override
            public void run() {
                fullyDrawnReporter.addReporter();

                // Do the background work.

               fullyDrawnReporter.removeReporter();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                fullyDrawnReporter.addReporter();

                // Do the background work.

                fullyDrawnReporter.removeReporter();
            }
        }).start();
    }
}

Uygulamanız Jetpack Compose'u kullanıyorsa belirtmek için aşağıdaki API'leri kullanabilirsiniz tamamen çizilmiş durum:

  • ReportDrawn: composable'ınızın hemen kullanıma hazır olduğunu gösterir bahsedeceğim.
  • ReportDrawnWhen: Bir koşulu (ör. list.count > 0) alır. composable'ınızın etkileşime hazır olduğunu belirtin.
  • ReportDrawnAfter: Bir askıya alma yöntemi alır. Bu yöntem, tamamlandıktan sonra composable'ınızın etkileşime hazır olduğunu gösterir.
Performans sorunlarını belirleme

Performans sorunlarını tespit etmek için Android Studio CPU Profiler'ı kullanabilirsiniz. Daha fazla CPU Profiler ile CPU etkinliğini inceleme başlıklı makaleyi inceleyin.

Satır içi izleme sayesinde olası performans sorunları hakkında da bilgi edinebilirsiniz. uygulamanızın içinde ve etkinliklerin onCreate() yöntem. Satır içi reklamlar hakkında bilgi edinmek için Trace işlevlerine ilişkin dokümanlara ve genel bakış"a göz önünde bulundurmanız gerekir.

Sık karşılaşılan sorunları çözme

Bu bölümde, uygulama başlatma performansını sıklıkla etkileyen çeşitli sorunlar ele alınmaktadır. Bu sorunlar temel olarak uygulama ve etkinlik nesnelerinin başlatılmasıyla ilgilidir. en iyi uygulamaları paylaşacağız.

Yoğun uygulama başlatma

Kodunuz Application nesnesini geçersiz kıldığında başlatma performansı düşebilir ve bu nesne ilk kullanıma hazırlanırken yoğun çalışma veya karmaşık mantık yürütür. Uygulamanız Application alt sınıflarınız iyi performans gösterirse başlatma sırasında zaman kaybedebilirsiniz ilk kullanıma hazırlar.

Bazı başlatma işlemleri tamamen gereksiz olabilir (ör. başlatma sırasında) başlatıldığında ana aktiviteye ait durum bilgilerini yanıt vermektir. Amaç ile, uygulama yalnızca bir alt kümeyi kullanır durumunu tekrar ele alacağız.

Uygulamayı başlatma sırasında karşılaşılan diğer zorluklar arasında atık toplama etkinlikleri bulunur ya da aynı anda gerçekleşen disk G/Ç'si de olabilir. Bu da başlatma işlemini daha da engeller. Çöp koleksiyonu, özellikle Dalvik çalışma zamanı açısından Android Çalışma zamanı (ART), atık toplama işlemini eşzamanlı olarak gerçekleştirerek etkisini görebilirsiniz.

Sorunu teşhis etme

Sorunu teşhis etmeye çalışmak için yöntem izleme veya satır içi izleme özelliğini kullanabilirsiniz.

Yöntem izleme

CPU Profiler'ı çalıştırdığınızda callApplicationOnCreate() yöntemi sonunda com.example.customApplication.onCreate yönteminizi çağırır. Eğer araç, bu yöntemlerin yürütülmesinin uzun sürdüğünü gösteriyor. ve orada ne tür çalışmaların yapıldığını görmek üzere araştırma yapabilirsiniz.

Satır içi izleme

Aşağıdakiler de dahil olmak üzere olası nedenleri araştırmak için satır içi izlemeyi kullanın:

  • Uygulamanızın ilk onCreate() işlevi.
  • Uygulamanızın başlattığı tüm global tekil nesneler.
  • yardım edebilirler.

Sorunun çözümleri

Sorun ister gereksiz başlatmalardan ister disk G/Ç'sinden kaynaklanıyor olsun, geç başlatmadır. Başka bir deyişle, yalnızca hemen gereklidir. Genel statik nesneler oluşturmak yerine uygulamanın nesneleri yalnızca ihtiyaç duyduğunda başlattığı tekli kalıp gerekir.

Ayrıca, kullanmayı düşünebileceğiniz Hilt gibi bir bağımlılık yerleştirme çerçevesi ilk kez eklendiğinde nesneler ve bağımlılıklar oluşturur.

Uygulamanız başlangıçta uygulama bileşenlerini ilk kullanıma hazırlamak için içerik sağlayıcılar kullanıyorsa bunun yerine Uygulama Başlatma kitaplığını kullanabilirsiniz.

Yoğun etkinlik başlatma

Etkinlik oluşturma, genellikle çok fazla ek yük gerektirir. Çoğu zaman performansı artırmak için bu çalışmayı optimize etme fırsatları sunar. Böyle yaygın sorunlar şunlardır:

  • Büyük veya karmaşık düzenleri şişirme.
  • Disk veya ağ G/Ç üzerinde ekran çizimi engelleniyor.
  • Bit eşlemleri yükleme ve kodunu çözme.
  • VectorDrawable nesneleri pikselleştiriliyor.
  • Etkinliğin diğer alt sistemlerinin başlatılması.

Sorunu teşhis etme

Bu durumda da hem yöntem izleme hem de satır içi izleme yararlı olabilir.

Yöntem izleme

CPU Profiler'ı kullanırken uygulamanızın Application alt sınıf kurucuları ve com.example.customApplication.onCreate() yöntemleridir.

Araç bu yöntemlerin yürütülmesinin uzun sürdüğünü gösterirse ve orada ne tür çalışmaların yapıldığını görmek üzere araştırma yapabilirsiniz.

Satır içi izleme

Aşağıdakiler de dahil olmak üzere olası nedenleri araştırmak için satır içi izlemeyi kullanın:

  • Uygulamanızın ilk onCreate() işlevi.
  • Başlattığı tüm global tekil nesneler.
  • yardım edebilirler.

Sorunun çözümleri

Pek çok olası darboğaz vardır, ancak sık karşılaşılan iki sorun ve çözümü şu şekilde:

  • Görünüm hiyerarşiniz ne kadar büyükse uygulamanın bunu şişirmesi o kadar fazla zaman alır. İki bu sorunu gidermek için uygulayabileceğiniz adımlar şunlardır:
    • Gereksiz veya iç içe yerleştirilmiş düzenleri azaltarak görünüm hiyerarşinizi düzeltin.
    • Lansman sırasında görünür olması gerekmeyen kullanıcı arayüzü bölümlerini büyütmeyin. Bunun yerine, alt hiyerarşiler için yer tutucu olarak bir ViewStub nesnesi kullanın uygulama için daha uygun bir zamana erişebilmesidir.
  • Tüm kaynak başlatma işlemlerinizin ana iş parçacığında bulunması da yavaşlayabilir . Bu sorunu aşağıdaki şekilde ele alabilirsiniz:
    • Uygulamanın bir cihazda gecikmeli olarak gerçekleştirebilmesi için tüm kaynak başlatma işlemini taşıyın kullanabilirsiniz.
    • Uygulamanın yüklenip görünümlerinizi göstermesine izin verin ve daha sonra görseli güncelleyin özellikleri olabilir.

Özel başlangıç ekranları

Aşağıdakilerden birini daha önce kullandıysanız başlatma sırasında fazladan süre görebilirsiniz: Android 11'de (API) özel bir başlangıç ekranı uygulamak için aşağıdaki yöntemleri 30. seviye) veya daha eski sürümler:

  • Baştaki sayfayı kapatmak için windowDisablePreview tema özelliğini kullanmak sırasında sistem tarafından çizilen boş ekran.
  • Özel bir Activity kullanılıyor.

Android 12'den itibaren SplashScreen API'ye geçiş yapılması zorunludur. Bu API, daha hızlı bir başlatma süresi sağlar ve başlangıç ekranınızı şu yöntemleri kullanabilirsiniz:

Ayrıca, karşılaştırma kitaplığı SplashScreen API'yi geriye dönük olarak destekler. ve ilk etapta tutarlı bir görünüm ve tarz yaratmak için geriye dönük uyumluluk tüm Android sürümlerinde ekran görüntüsü alınır.

Ayrıntılar için Başlangıç ekranı taşıma rehberine bakın.

ziyaret edin.