Start-up-Profile erstellen

Start-up-Profile sind eine Teilmenge der Baseline-Profile. Start-up-Profile werden verwendet vom Build-System verwendet, um die darin enthaltenen Klassen und Methoden weiter zu optimieren indem du das Codelayout in den DEX-Dateien deines APK verbessert. Mit Startprofilen ist der App-Start in der Regel zwischen 15 % und 30 % schneller als nur mit Baseline-Profilen.

Abbildung 1. Verbesserung der Codelokalität durch DEX-Layout Optimierung.

Voraussetzungen

Wir empfehlen, Start-up-Profile mit den folgenden Tools zu verwenden:

  • Jetpack Macrobenchmark 1.2.0 oder höher
  • Android Gradle Plugin 8.2 oder höher
  • Android Studio Iguana oder höher

Darüber hinaus sind die folgenden Einstellungen in Ihrer App erforderlich:

  • R8 muss aktiviert sein. Legen Sie für Ihren Release-Build isMinifyEnabled = true fest.
  • DEX-Layoutoptimierungen aktiviert. Legen Sie im Block baselineProfile {} der Build-Datei des App-Moduls dexLayoutOptimization = true fest.

Startprofil erstellen

Android Studio erstellt neben einem Baseline-Profil ein Start-up-Profil, wenn Sie die Standardvorlage „Baseline Profile Generator“ verwenden.

Die allgemeinen Schritte zum Erstellen und Generieren eines Start-up-Profils sind dieselben wie bei um ein Baseline-Profil zu erstellen.

Standardmäßig wird ein Startprofil mit der Vorlage „Baseline Profile Generator“ in Android Studio erstellt. Dazu gehören Start-ups Interaktionen, die ein einfaches Start-up-Profil bilden. So erweitern Sie dieses Start-up-Profil mit mehr kritischen User Journeys (Critical User Journeys, CUJs) haben, fügen Sie Ihre App-Start-CUJs zu einem rule hinzu mit includeInStartupProfile auf true gesetzt. Bei einfachen Apps kann der Start Die MainActivity der App kann ausreichen. Bei komplexeren Anwendungen Ihrer App die häufigsten Einstiegspunkte hinzufügen, z. B. das Starten der App von zum Startbildschirm oder zu einem Deeplink.

Das folgende Code-Snippet zeigt einen Generator für Baseline-Profile (standardmäßig die BaselineProfileGenerator.kt-Datei), mit dem Ihre App vom Startbildschirm aus gestartet und ein Deeplink geöffnet wird. Der Deeplink führt direkt zum aus dem Nachrichtenfeed der App, nicht aus dem Startbildschirm der App.

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val rule = BaselineProfileRule()

    @Test
    fun generate() {
        rule.collect(
            packageName = "com.example.app",
            includeInStartupProfile = true
        ) {
            // Launch directly into the NEWS_FEED.
            startActivityAndWait(Intent().apply {
                setPackage(packageName)
                setAction("com.example.app.NEWS_FEED")
            })
        }
    }
}

Führen Sie die Konfiguration Generate Baseline Profile for app (Baseline-Profil für Anwendung generieren) aus und suchen Sie nach der Regeln für Start-up-Profil unter src/<variant>/generated/baselineProfiles/startup-prof.txt

Optimierung von Start-up-Profilen bestätigen

Um die Optimierung des DEX-Layouts zu bestätigen, verwende Android Studio, um das APK zu öffnen und die Klassen in den DEX-Dateien überprüfen. Die primäre classes.dex darf nicht vollständig ausgefüllt sind. Wenn Ihre App nur aus einer einzigen DEX-Datei besteht, können Sie Gibt an, ob die Anwendung nach der Aktivierung des Startprofils zwei DEX-Dateien enthält.

Android Studio warnt Sie, wenn die Startklassen nicht in eine einzelne DEX-Datei passen. Um Diagnoseinformationen zu erhalten, die die Anzahl der Nicht-Startmethoden in die Startklassen, achten Sie darauf, dass der R8-Compiler mindestens auf die Version 8.3.36-dev durch folgende Änderungen an der Datei settings.gradle beim wenden Sie das Start-up-Profil an:

Kotlin

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:8.3.6-dev")
        }
    }
}

Cool

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url uri('https://storage.googleapis.com/r8-releases/raw')
            }
        }
        dependencies {
            classpath 'com.android.tools:r8:8.3.6-dev"
        }
    }
}

Füge danach --info hinzu assembleRelease im folgenden Befehl, wenn Sie Builds mit Gradle erstellen.

./gradlew assembleRelease --info

Die Diagnose wird dann an das Terminal ausgegeben.

Wenn Ihre App oder Bibliotheken auf nicht mehr unterstützte APIs verweisen, werden die gebündelten Kompatibilitätsimplementierungen dieser Klassen immer in der letzten DEX-Datei. Diese desugarierte letzte DEX-Datei nimmt nicht an DEX-Layoutoptimierungen teil.

Überlegungen zum Erstellen von Start-up-Profilen

Die Ausgabe der Klassen und Methoden eines Startprofils ist durch die Größe mit der ersten Class.dex-Datei. Das bedeutet, dass nicht alle Baseline-Profilpfade sollten auch die Profile von Start-ups sein.

Um zu entscheiden, welche User Journeys beim Erstellen eines Start-up-Profils abgedeckt werden sollen, bei dem die meisten Nutzenden die App starten. Normalerweise geschieht dies über den Launcher und nachdem sich der Nutzer angemeldet hat. Dies ist auch der einfachste Pfad für das Baseline-Profil.

Nachdem der erste Anwendungsfall behandelt wurde, folgen Sie dem Nutzertrichter für die App Start-up. In vielen Fällen sind App-Start-Trichter der folgenden Liste:

  1. Hauptaktivität des Launchers
  2. Benachrichtigungen, die den App-Start auslösen
  3. Optionale Launcher-Aktivitäten

Arbeite diese Liste von oben an und halte an, bevor „classes.dex“ voll ist. Wenn Sie später weitere Aufrufabfolgen abdecken möchten, verschieben Sie den Code aus dem Startpfad und fügen Sie weitere Aufrufabfolgen hinzu. Wenn Sie Code aus dem Startpfad verschieben möchten, prüfen Sie die Perfetto-Traces während des App-Starts und auf lang andauernde Vorgänge achten. Sie können auch einen Makrobenchmark mit aktiviertem Methoden-Tracing verwenden, um eine automatisierbare und vollständige Übersicht über die Methodenaufrufe beim Starten der App zu erhalten.