0Pricing
Android Academy · Lekcja

Profile uruchamiania i Baseline Profiles

Szybsze uruchamianie aplikacji od zera

Profile uruchamiania i Baseline Profiles to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.

Pierwsze wrażenie: uruchamianie aplikacji

Czas uruchamiania to pierwsze doświadczenie każdego użytkownika. Google Play wskazuje nawet powolne uruchamianie jako problem z jakością. Szybki zimny start sprawia, że aplikacja wydaje się dopracowana, a powolny powoduje, że użytkownicy z niej rezygnują.

W tej lekcji poznasz trzy rodzaje uruchamiania, przyczyny powolnego startu oraz nowoczesne narzędzia — App Startup i Baseline Profiles — które znacznie przyspieszają zimny start.

Zimny, ciepły i gorący start

Android definiuje trzy scenariusze uruchamiania, od najwolniejszego do najszybszego:

  • Zimny start: proces nie istnieje. Android tworzy go, uruchamia Application, a następnie pierwszy ekran. To najwolniejszy i najważniejszy do optymalizacji scenariusz.
  • Ciepły start: proces działa, ale Activity musi zostać odtworzone.
  • Gorący start: Activity nadal znajduje się w pamięci, więc wystarczy wyświetlić je na pierwszym planie. Dzieje się to niemal natychmiast.

Wysiłki optymalizacyjne koncentrują się na zimnym starcie, ponieważ właśnie z nim najczęściej spotykają się nowi i powracający użytkownicy.

Pomiar czasu uruchamiania

Nie można poprawić tego, czego się nie mierzy. Są dwa proste sposoby:

  • Logcat: system zapisuje wiersz Displayed z czasem do wyświetlenia pierwszej klatki.
  • Macrobenchmark: StartupTimingMetric zapewnia stabilne i powtarzalne wyniki zimnego startu.

Uruchom poniższe polecenie adb i obserwuj wiersz Displayed.

# 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"

Utrzymuj Application.onCreate w lekkiej formie

Wszystko w Application.onCreate() działa w głównym wątku przed wyświetleniem pierwszej klatki. Ciężka inicjalizacja w tym miejscu bezpośrednio opóźnia uruchomienie.

Poniższa niepoprawna wersja zachłannie inicjalizuje kilka bibliotek. Odłóż lub przenieś do tła wszystko, co nie jest potrzebne na pierwszym ekranie.

// 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.

Biblioteka Jetpack App Startup

Biblioteka App Startup zastępuje wiele dostawców treści bibliotek (z których każdy kosztuje trochę czasu) jednym współdzielonym dostawcą oraz pozwala przejrzyście określić kolejność i zależności inicjalizacji.

Dla każdego komponentu implementujesz element Initializer; App Startup uruchamia je raz, w kolejności wynikającej z zależności.

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.

Leniwa i działająca w tle inicjalizacja

Jeszcze lepszym rozwiązaniem niż porządkowanie zachłannej pracy jest wykonywanie mniejszej ilości pracy podczas uruchamiania. Dwie metody:

  • Leniwa: twórz ciężkie obiekty dopiero przy pierwszym użyciu za pomocą by lazy w Kotlinie.
  • Działająca w tle: przenieś inicjalizację niezwiązaną z interfejsem użytkownika poza główny wątek.

Dzięki temu pierwsza klatka nie jest blokowana przez pracę, której użytkownik jeszcze nie potrzebuje.

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 a JIT: dlaczego pierwsze uruchomienie jest powolne

Domyślnie Android uruchamia kod bajtowy aplikacji, łącząc interpretację z kompilacją Just-In-Time (JIT). Przy pierwszym wykonaniu często używanego kodu jest on interpretowany (powolny), a dopiero później środowisko uruchomieniowe kompiluje go do kodu natywnego.

Właśnie dlatego zimny start i pierwsze przewijanie są wolniejsze. Baseline Profiles rozwiązują ten problem, informując urządzenie, aby podczas instalacji skompilowało ważny kod Ahead-Of-Time (AOT).

Czym jest profil bazowy

Baseline Profile to lista klas i metod używanych podczas kluczowych scenariuszy (uruchamiania i pierwszego przewijania). Dołączasz go do aplikacji, a podczas instalacji urządzenie kompiluje te metody AOT, dzięki czemu od pierwszego uruchomienia działają z natywną szybkością.

Według danych Google poprawa czasu uruchamiania często wynosi od 20 do 40%, bez zmian w kodzie funkcji — wystarczy sam profil.

// 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.

Generowanie profilu bazowego

Profil generujesz, pisząc niewielki test, który przeprowadza kluczową ścieżkę na urządzeniu. Narzędzia rejestrują wykonane metody i zapisują plik profilu. Następnie zatwierdzasz go w repozytorium i ponownie budujesz aplikację.

Oto typowy generator rejestrujący uruchomienie i przewijanie.

@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.

Weryfikacja efektu

Zawsze potwierdzaj poprawę za pomocą benchmarku, porównując uruchamianie z zastosowanym profilem i bez niego (CompilationMode.None oraz Partial z profilem).

Jeśli nie mierzysz wyników, nie możesz udowodnić, że profil pomógł — a nieaktualny profil może nawet zaszkodzić. Generuj go ponownie za każdym razem, gdy ścieżki często wykonywanego kodu znacząco się zmienią.

@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()
}

Plan optymalizacji uruchamiania

Przekształć te wskazówki w powtarzalny plan:

  • Zmierz zimny start za pomocą Macrobenchmark i adb am start -W.
  • Ogranicz Application.onCreate: odłóż inicjalizację za pomocą by lazy i przenieś pracę poza główny wątek.
  • Użyj App Startup, aby połączyć dostawców treści i uporządkować inicjalizację.
  • Dołącz Baseline Profile w celu kompilacji AOT kluczowej ścieżki.
  • Zweryfikuj wynik benchmarkiem i dbaj o aktualność profilu.

Rezultat: pierwsza klatka pojawia się błyskawicznie, co użytkownicy zauważają.

Szybkie sprawdzenie

Dołączasz Baseline Profile do swojej aplikacji. Co przede wszystkim robi ten profil, aby poprawić czas uruchamiania?

Podsumowanie: szybko od pierwszej klatki

Dowiedziałeś się, jak optymalizować uruchamianie — najbardziej widoczny wskaźnik wydajności:

  • Optymalizuj zimny start; mierz go za pomocą Macrobenchmark i adb am start -W.
  • Utrzymuj Application.onCreate w lekkiej formie: używaj leniwej inicjalizacji i wykonuj pracę niezwiązaną z interfejsem w tle.
  • Używaj biblioteki App Startup do łączenia dostawców i porządkowania inicjalizatorów.
  • Dołącz Baseline Profile, aby często wykonywany kod był kompilowany AOT podczas instalacji i działał z natywną szybkością przy pierwszym uruchomieniu.
  • Zawsze weryfikuj efekt benchmarkiem i dbaj o aktualność profilu.

To kończy temat Performance Optimization & Profiling: możesz teraz mierzyć wydajność, kontrolować recomposition, naprawiać wycieki i szybko uruchamiać aplikację.

Często zadawane pytania

Czy lekcja „Profile uruchamiania i Baseline Profiles” jest bezpłatna?

Tak — pełny tekst „Profile uruchamiania i Baseline Profiles” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Profile uruchamiania i Baseline Profiles”?

Szybsze uruchamianie aplikacji od zera Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Android Academy?

Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Profile uruchamiania i Baseline Profiles”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?

Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Pomiar wydajności
  2. Poskramianie rekompozycji
  3. Wycieki pamięci i ich usuwanie
  4. Profile uruchamiania i Baseline Profiles
← Powrót do Android Academy