Startup- und Baseline-Profile
Kaltstarts beschleunigen
Startup- und Baseline-Profile ist eine kostenlose Android Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Android Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.
Der erste Eindruck: App-Startup
Die Startzeit ist das Erste, was jeder Benutzer erlebt. Google Play weist sogar auf langsame Starts als Qualitätsproblem hin. Ein schneller Cold Start lässt eine App hochwertig wirken; ein langsamer sorgt dafür, dass Benutzer abspringen.
In dieser Lektion lernen Sie die drei Starttypen kennen, erfahren, was den Start verlangsamt, und lernen die modernen Werkzeuge – App Startup und Baseline Profiles – kennen, die Cold Starts deutlich schneller machen.
Cold-, Warm- und Hot-Start
Android unterscheidet drei Start-Szenarien, vom langsamsten zum schnellsten:
- Cold Start: Der Prozess existiert nicht. Android erstellt ihn, führt
Applicationund anschließend Ihren ersten Bildschirm aus. Dies ist der langsamste und wichtigste Starttyp für Optimierungen. - Warm Start: Der Prozess lebt, aber die Activity muss neu erstellt werden.
- Hot Start: Die Activity befindet sich noch im Speicher und wird lediglich in den Vordergrund gebracht. Fast sofort abgeschlossen.
Die Optimierung konzentriert sich auf den Cold Start, da dieser bei neuen und zurückkehrenden Benutzern am häufigsten auftritt.
Startzeit messen
Was Sie nicht messen, können Sie nicht verbessern. Dafür gibt es zwei einfache Möglichkeiten:
- Logcat: Das System protokolliert eine
Displayed-Zeile mit der Zeit bis zum ersten Frame. - Macrobenchmark:
StartupTimingMetricliefert stabile, reproduzierbare Werte für den Cold Start.
Führen Sie den folgenden adb-Befehl aus und achten Sie auf die Displayed-Zeile.
# Cold-start the app and log time to first frame
adb shell am start -W -S com.example.app/.MainActivity
# Output includes:
# TotalTime: 412 <- ms to first frame
# Or filter logcat:
adb logcat | grep "Displayed com.example.app"Application.onCreate schlank halten
Alles in Application.onCreate() wird im Hauptthread vor Ihrem ersten Frame ausgeführt. Eine aufwendige Initialisierung verzögert den Start daher direkt.
Die fehlerhafte Version unten initialisiert mehrere Bibliotheken sofort. Verschieben Sie alles, was für den ersten Bildschirm nicht benötigt wird, oder führen Sie es im Hintergrund aus.
// SLOW: blocks the first frame with eager init
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Analytics.init(this) // network, disk
ImageLoader.preload(this) // heavy
Database.warmUp(this) // disk I/O
}
}
// Each of these adds milliseconds before the user sees anything.Die Jetpack-App-Startup-Bibliothek
Die Bibliothek App Startup ersetzt mehrere Content Provider (die jeweils Zeit kosten) durch einen einzigen gemeinsam genutzten Provider und ermöglicht es Ihnen, die Reihenfolge und Abhängigkeiten der Initialisierung übersichtlich zu definieren.
Sie implementieren für jede Komponente einen Initializer. App Startup führt diese einmal und in Abhängigkeitsreihenfolge aus.
class AnalyticsInitializer : Initializer<Analytics> {
override fun create(context: Context): Analytics {
return Analytics.init(context.applicationContext)
}
// Runs after Logger is ready
override fun dependencies() = listOf(LoggerInitializer::class.java)
}
// Registered via a single merged provider in the manifest,
// avoiding one ContentProvider per library.Lazy- und Hintergrundinitialisierung
Noch besser, als aufwendige Arbeit nur zu ordnen, ist es, beim Start weniger davon auszuführen. Zwei Möglichkeiten:
- Lazy: Erstellen Sie aufwendige Objekte bei der ersten Verwendung mit Kotlin's
by lazy. - Im Hintergrund: Verschieben Sie nicht für die UI benötigte Initialisierung aus dem Hauptthread.
Dadurch wird der erste Frame nicht durch Arbeit blockiert, die der Benutzer noch nicht benötigt.
class MyApp : Application() {
// Built only when first accessed, not during onCreate
val imageLoader by lazy { ImageLoader.build(this) }
override fun onCreate() {
super.onCreate()
// Push non-critical setup off the main thread
CoroutineScope(Dispatchers.Default).launch {
Analytics.init(applicationContext)
}
}
}AOT vs. JIT: Warum der erste Start langsam ist
Standardmäßig führt Android den Bytecode Ihrer App mit einer Mischung aus Interpretation und Just-In-Time-(JIT-)Kompilierung aus. Wenn häufig ausgeführter Code zum ersten Mal läuft, wird er zunächst interpretiert (langsam). Erst später kompiliert die Laufzeitumgebung ihn in nativen Code.
Genau deshalb fühlen sich der Cold Start und das erste Scrollen langsamer an. Baseline Profiles beheben dieses Problem, indem sie dem Gerät mitteilen, den wichtigen Code bei der Installation Ahead-Of-Time (AOT) zu kompilieren.
Was ein Baseline Profile ist
Ein Baseline Profile ist eine Liste der Klassen und Methoden, die während Ihrer wichtigsten Abläufe verwendet werden (Start, erstes Scrollen). Sie liefern es mit der App aus. Bei der Installation kompiliert das Gerät diese Methoden per AOT, sodass sie bereits beim allerersten Start mit nativer Geschwindigkeit ausgeführt werden.
Google berichtet häufig von Verbesserungen der Startzeit im Bereich von 20–40 %, ohne dass Sie den Code Ihrer Funktionen ändern müssen – nur das Profil ist erforderlich.
// build.gradle.kts
plugins { id("androidx.baselineprofile") }
dependencies {
baselineProfile(project(":baselineprofile"))
}
// The generated profile ships as
// assets/dexopt/baseline.prof
// and is applied automatically at install.Ein Baseline Profile erstellen
Sie erstellen das Profil, indem Sie einen kleinen Test schreiben, der den kritischen Ablauf auf einem Gerät ausführt. Die Tools zeichnen auf, welche Methoden ausgeführt wurden, und schreiben die Profildatei. Anschließend übernehmen Sie sie in die Versionsverwaltung und erstellen den Build neu.
Hier sehen Sie einen typischen Generator, der den Start und einen Scrollvorgang erfasst.
@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
@get:Rule val rule = BaselineProfileRule()
@Test
fun generate() = rule.collect(packageName = "com.example.app") {
pressHome()
startActivityAndWait()
// exercise the critical journey
device.findObject(By.res("feed")).fling(Direction.DOWN)
}
}
// Run the generateBaselineProfile Gradle task to produce the file.Den Erfolg überprüfen
Bestätigen Sie die Verbesserung immer mit einem Benchmark, indem Sie den Start mit und ohne angewendetes Profil vergleichen (CompilationMode.None gegenüber Partial mit dem Profil).
Wenn Sie nicht messen, können Sie nicht nachweisen, dass das Profil geholfen hat – und ein veraltetes Profil kann sogar schaden. Erstellen Sie es neu, sobald sich Ihre Hot Paths deutlich ändern.
@Test
fun startupWithProfile() = rule.measureRepeated(
packageName = "com.example.app",
metrics = listOf(StartupTimingMetric()),
iterations = 10,
startupMode = StartupMode.COLD,
compilationMode = CompilationMode.Partial() // uses the baseline profile
) {
pressHome()
startActivityAndWait()
}Ein Plan zur Startup-Optimierung
Führen Sie die folgenden Schritte als wiederholbaren Plan zusammen:
- Messen Sie den Cold Start mit Macrobenchmark und
adb am start -W. - Reduzieren Sie
Application.onCreate: Verschieben Sie Initialisierungen mitby lazyund verlagern Sie Arbeit aus dem Hauptthread. - Verwenden Sie App Startup, um Content Provider zusammenzuführen und die Initialisierungsreihenfolge festzulegen.
- Liefern Sie ein Baseline Profile für die AOT-Kompilierung des kritischen Ablaufs aus.
- Überprüfen Sie das Ergebnis mit einem Benchmark und halten Sie das Profil aktuell.
Das Ergebnis: ein schneller erster Frame, den Benutzer sofort bemerken.
Kurzer Test
Sie liefern ein Baseline Profile mit Ihrer App aus. Was bewirkt es hauptsächlich, um den Start zu verbessern?
Zusammenfassung: Schnell ab dem ersten Frame
Sie haben gelernt, den Start zu optimieren – die sichtbarste Performance-Metrik:
- Optimieren Sie den Cold Start und messen Sie ihn mit Macrobenchmark und
adb am start -W. - Halten Sie
Application.onCreateschlank: Verwenden Sie Lazy-Initialisierung und führen Sie nicht für die UI benötigte Arbeit im Hintergrund aus. - Verwenden Sie die Bibliothek App Startup, um Provider zusammenzuführen und Initializer zu ordnen.
- Liefern Sie ein Baseline Profile aus, damit häufig ausgeführter Code bei der Installation per AOT kompiliert wird und bereits beim ersten Start mit nativer Geschwindigkeit läuft.
- Überprüfen Sie den Erfolg immer mit einem Benchmark und halten Sie das Profil aktuell.
Damit ist die Lektion zur Performance-Optimierung und zum Profiling abgeschlossen: Sie können nun messen, Recompositionen in den Griff bekommen, Leaks beheben und den Start beschleunigen.
Häufig gestellte Fragen
Ist die Lektion „Startup- und Baseline-Profile“ kostenlos?
Ja — der vollständige Text von „Startup- und Baseline-Profile“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Android Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Android Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Startup- und Baseline-Profile“?
Kaltstarts beschleunigen Du übst Android Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Android Academy zu starten?
Keine Vorkenntnisse erforderlich. Android Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Startup- und Baseline-Profile“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Android Academy-Lektion Code schreiben und ausführen?
Ja. Jede Android Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Performance messen
- Recomposition bändigen
- Memory Leaks und ihre Behebung
- Startup- und Baseline-Profile