Analyse und Optimierung von App-Start-ups

Während des App-Starts macht Ihre App bei den Nutzern den ersten Eindruck. App-Start müssen schnell geladen werden können und Informationen anzeigen, die der Nutzer für die Verwendung Ihrer App benötigt. Wenn dass der Start Ihrer App zu lange dauert, können Nutzer sie beenden, warten zu lange.

Wir empfehlen die Verwendung der MacroBenchmark-Bibliothek, um zu messen, Start-up. Die Bibliothek bietet einen Überblick und detaillierte System-Traces, was beim Start passiert.

System-Traces liefern nützliche Informationen darüber, was auf Ihrem Gerät passiert, mit dem Sie nachvollziehen können, was Ihre App beim Start macht, Optimierungsmöglichkeiten zu erkennen.

So analysieren Sie den Anwendungsstart:

Schritte zur Analyse und Optimierung des Starts

Anwendungen müssen beim Start oft spezifische Ressourcen laden, Endanwendenden. Nicht benötigte Ressourcen können das Laden bis nach dem Start warten abgeschlossen wird.

Beachten Sie Folgendes, um Kompromisse bei der Leistung zu treffen:

  • Verwenden Sie die MacroBenchmark-Bibliothek, um die von jedem Vorgang beanspruchte Zeit zu messen. und identifizieren Sie Blöcke, die lange dauern.

  • Prüfen Sie, ob der ressourcenintensive Vorgang für den Anwendungsstart entscheidend ist. Wenn kann der Vorgang warten, bis die Anwendung vollständig gezeichnet ist, Ressourceneinschränkungen beim Start.

  • Achten Sie darauf, dass dieser Vorgang beim Start der App ausgeführt wird. Häufig unnötige Vorgänge können über Legacy-Code oder Drittanbieter- Bibliotheken.

  • Verschieben Sie lang andauernde Vorgänge nach Möglichkeit in den Hintergrund. Hintergrund Prozesse können sich weiterhin auf die CPU-Nutzung während des Starts auswirken.

Nachdem Sie den Vorgang gründlich untersucht haben, können Sie entscheiden, welchen Kompromiss es eingehen soll zwischen der Ladezeit und der Notwendigkeit der Einbindung in die App, Start-up. Berücksichtigen Sie auch das Potenzial für Regressionen oder funktionsgefährdende Änderungen. wenn Sie den Workflow Ihrer App ändern.

Optimieren und analysieren Sie erneut, bis Sie mit der Startzeit Ihrer Weitere Informationen finden Sie unter Messwerte zum Erkennen und Diagnostizieren verwenden Probleme.

Messen und analysieren Sie den Zeitaufwand für wichtige Vorgänge

Wenn Sie ein vollständiges App-Start-Trace haben, sehen Sie sich den Trace an und messen Sie die Zeit. für wichtige Vorgänge wie bindApplication oder activityStart genommen. Mi. empfehlen wir Perfetto oder die Android-App Studio Profiler, um diese Traces zu analysieren.

Die Gesamtzeit beim App-Starten betrachten, um Vorgänge zu identifizieren die Folgendes tun:

  • Die Daten können über einen langen Zeitraum hinweg optimiert werden. Jede Millisekunde zählt die Leistung. Suchen Sie zum Beispiel nach Choreographer Zeichenzeiten, Layout die Ladezeiten der Bibliothek, Binder-Transaktionen oder Ressourcenlast Mal. Im Allgemeinen sollten Sie sich alle Vorgänge ansehen, die länger 20ms.
  • Hauptthread blockieren Weitere Informationen finden Sie unter In einem Systrace navigieren Bericht.
  • Sie müssen nicht während des Starts ausgeführt werden.
  • Kann warten, bis der erste Frame gezeichnet wurde.

Untersuchen Sie jeden dieser Traces weiter, um Leistungslücken zu finden.

Teure Vorgänge im Hauptthread identifizieren

Es empfiehlt sich, teure Vorgänge wie Datei-E/A und Netzwerk beizubehalten auch außerhalb des Hauptthreads. Das ist beim Start der App ebenso wichtig, da kostspielige Vorgänge im Hauptthread dazu führen können, dass die App nicht mehr reagiert. und andere wichtige Vorgänge verzögern. StrictMode.ThreadPolicy kann bei der Identifizierung von Fällen, in denen kostspielige Vorgänge im Hauptthread stattfinden. Es empfiehlt sich, StrictMode auf um Probleme so früh wie möglich zu identifizieren, wie in den folgendes Beispiel:

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()
            );
        }
        ...
    }
}

Mit StrictMode.ThreadPolicy wird die Threadrichtlinie für alle Debug-Builds aktiviert und stürzt die App ab, wenn Verstöße gegen die Thread-Richtlinie erkannt werden. erschwert es, Richtlinienverstöße für Threads zu übersehen.

TTID und TTFD

Um zu sehen, wie lange die App zum Erstellen des ersten Frames benötigt, messen Sie die Zeit zur ersten Anzeige (TTID) zu wechseln. Dieser Messwert spiegelt jedoch nicht unbedingt die Zeit wider, mit Ihrer App zu interagieren. Die Zeit bis zur vollständigen Aufladung Display (TTFD) ist höher ist hilfreich beim Messen und Optimieren der Codepfade, die für eine vollständige brauchbarer App-Status.

Strategien für die Berichterstellung bei vollständig gezeichneter App-Benutzeroberfläche findest du unter Start-up verbessern Zeitangaben Genauigkeit.

Optimieren Sie sowohl für TTID als auch TTFD, da beide in ihrem jeweiligen Bereich wichtig sind. Eine kurze TTID zeigt dem Nutzer, dass die App tatsächlich gestartet wird. Bei Einhaltung der Die TTFD-Kurzform ist wichtig, um sicherzustellen, dass Nutzer schnell auf die App zugreifen.

Gesamten Thread-Status analysieren

Wählen Sie die Startzeit der Anwendung aus und sehen Sie sich die Thread-Segmente insgesamt an. Im Hauptthread jederzeit reagieren.

Tools wie Android Studio Profiler und Perfetto geben einen detaillierten Überblick über den Hauptthread Phase verbessert. Weitere Informationen zur Visualisierung von Perfetto-Traces finden Sie in den Perfetto-UI Dokumentation.

Hauptteile des Ruhezustands des Hauptthreads identifizieren

Wenn du lange schläfst, liegt das wahrscheinlich an der Thread, der noch auf den Abschluss der Arbeit wartet. Wenn Sie eine Multithread-Anwendung haben, den Thread, auf den Ihr Hauptthread wartet, und optimieren Sie diese Geschäftsabläufe. Es kann auch hilfreich sein, dafür zu sorgen, dass keine unnötige Sperre Konflikt, der zu Verzögerungen im kritischen Pfad führt.

Blockierung des Hauptthreads und unterbrechungsfreier Ruhemodus reduzieren

Suchen Sie nach jeder Instanz des Hauptthreads, die blockiert wird. Logo: Perfetto Studio Profiler zeigt dies mit einem orangefarbenen Indikator am Thread-Status an. Zeitleiste. Vorgänge identifizieren, untersuchen, ob sie erwartet werden oder möglich sind vermeiden und bei Bedarf optimieren.

Ein unterbrochener Schlaf in Zusammenhang mit IO kann eine wirklich gute Gelegenheit für Verbesserungen sein. Andere Prozesse, die IO ausführen, können mit dem IO, den die Top-App ausführt.

Startzeit verbessern

Sobald Sie eine Optimierungsmöglichkeit identifiziert haben, sollten Sie sich über mögliche Lösungen informieren. zur Verkürzung der Startzeiten:

  • Inhalte zur Beschleunigung verzögert und asynchron laden TTID:
  • Minimieren Sie das Aufrufen von Funktionen, die Binder-Aufrufe ausführen. Wenn sie unvermeidbar sind, sollten Sie sicherstellen, dass Sie diese Aufrufe durch Caching optimieren, anstatt wiederholte Anrufe oder das Verschieben nicht blockierender Arbeit in Hintergrundthreads.
  • Damit der App-Start schneller erscheint, kannst du etwas anzeigen, erfordert für den Nutzer so schnell wie möglich nur minimales Rendering, bis der Rest das Laden des Bildschirms abgeschlossen ist.
  • Startprofil erstellen und hinzufügen zu Ihrer App hinzufügen.
  • Verwenden Sie die Jetpack-App-Startbibliothek, um die Initialisierung von Komponenten beim App-Start optimieren.

UI-Leistung analysieren

Der App-Start umfasst einen Ladebildschirm und die Ladezeit Ihrer Startseite. Bis den App-Start optimieren, Traces untersuchen, um zu verstehen, wie lange es dauert, bis Ihre UI gezeichnet werden.

Arbeit an der Initialisierung begrenzen

Das Laden bestimmter Frames kann mehr Zeit in Anspruch nehmen als andere. Diese werden als kostspielige Vorteile für die App.

So optimieren Sie die Initialisierung:

  • Priorisieren Sie Karten/Tickets mit langsamem Layout und wählen Sie diese zur Verbesserung aus.
  • Prüfen Sie jede Warnung von Perfetto und von Systrace, indem Sie benutzerdefinierten Trace-Ereignissen, oder Verspätungen.

Framedaten messen

Es gibt mehrere Möglichkeiten, Frame-Daten zu messen. Die fünf wichtigsten Erhebungsmethoden sind:

  • Lokale Erfassung mit dumpsys gfxinfo:Nicht alle in der dumpsys-Daten sind für das langsame Rendering der App verantwortlich auf die Endanwendenden auswirken. Dies ist jedoch eine gute Kennzahl, die Sie Releasezyklen, um den allgemeinen Trend der Leistung zu verstehen. Bis Weitere Informationen zum Einbinden der UI mit gfxinfo und framestats Leistungsmessungen in Ihre Testverfahren integrieren, siehe Grundlagen der Android-Apps testen.
  • Felderfassung mit JankStats: Mit JankStats Frame-Renderingzeiten für bestimmte Teile deiner App erfassen erstellen und die Daten aufzeichnen und analysieren.
  • In Tests mit MacroBenchmark (Perfetto)
  • Perfetto FrameTimeline: Unter Android 12 (API-Level 31) kannst du Frame-Zeitachse Messwerte von einem Perfetto-Trace, zu dem die Arbeit den Frame-Abfall verursacht. Dabei kann es sich um um zu ermitteln, warum Frames verworfen werden.
  • Android Studio Profiler für jank Erkennung

Ladezeit der Hauptaktivität prüfen

Die Hauptaktivität Ihrer App kann eine große Menge an Informationen enthalten, die aus mehreren Quellen geladen werden. Prüfe den Grundriss Activity des Zuhauses und insbesondere sieh dir den Choreographer.onDraw an Methode der Aktivität zu Hause.

  • reportFullyDrawn verwenden um dem System zu melden, dass Ihre App nun vollständig für die Optimierung vorgesehen ist. zu verstehen.
  • Aktivitäten und App-Starts mit StartupTimingMetric messen mit der MacroBenchmark-Bibliothek.
  • Sieh dir die Drop-down-Menüs an.
  • Identifizieren Sie Layouts, deren Rendering oder Messung lange dauert.
  • Ermitteln Sie die Assets, die lange zum Laden benötigen.
  • Identifizieren Sie unnötige Layouts, die beim Start überhöht werden.

Ziehen Sie diese möglichen Lösungen in Betracht, um die Ladezeit der Hauptaktivität zu optimieren:

  • Gestalten Sie Ihr ursprüngliches Layout so einfach wie möglich. Weitere Informationen finden Sie unter Layout optimieren Hierarchien.
  • Fügen Sie benutzerdefinierte Tracepoints hinzu, um mehr Informationen zu verworfenen Frames und und komplexen Layouts.
  • Minimiere die Anzahl und Größe der beim Start geladenen Bitmapressourcen.
  • ViewStub in Bereichen ohne sofort VISIBLE. Ein ViewStub ist eine unsichtbare Ansicht mit Nullgröße, kann verwendet werden, um Layoutressourcen zur Laufzeit verzögert zu erhöhen. Weitere Informationen Weitere Informationen finden Sie unter ViewStub.

    Wenn Sie Jetpack Compose verwenden, erhalten Sie ähnliche Verhalten von ViewStub mithilfe des Zustands, um das Laden einiger Komponenten zu verzögern:

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

    Laden Sie die zusammensetzbaren Elemente in den bedingten Block, indem Sie shouldLoad:

    LaunchedEffect(Unit) {
     shouldLoad = true
    }
    

    Dies löst eine Neuzusammensetzung aus, die den Code in der Bedingung im ersten Snippet einfügen.