Omówienie profili podstawowych

Profile bazowe przyspieszają wykonywanie kodu o około 30% od pierwszego uruchomienia dzięki unikaniu interpretacji i kroków kompilacji just-in-time (JIT) w przypadku uwzględnionych ścieżek kodu.

Przesyłając profil podstawowy w aplikacji lub bibliotece, środowisko wykonawcze Androida (ART) może optymalizować określone ścieżki kodu przez kompilację z wyprzedzeniem (AOT) w celu poprawy wydajności w przypadku każdego nowego użytkownika i każdej aktualizacji aplikacji. Ta optymalizacja profilowa z pomocą profilu umożliwia aplikacjom optymalizowanie uruchamiania, ograniczanie zaśmiecania się interakcji i poprawę ogólnej wydajności środowiska wykonawczego u użytkowników już od pierwszego wprowadzenia na rynek.

Te wzrosty skuteczności bezpośrednio przekładają się na lepsze dane biznesowe, takie jak utrzymanie użytkowników, transakcje i oceny. Więcej informacji o wpływie wydajności na dane biznesowe znajdziesz w artykułach Josh, Lyft, TikTok i Zomato.

Zalety profili podstawowych

Profile bazowe usprawniają wszystkie interakcje użytkowników, np. uruchamianie aplikacji, poruszanie się między ekranami czy przewijanie treści, już przy pierwszym uruchomieniu. Zwiększając szybkość i czas reakcji aplikacji, profile bazowe mogą przyczynić się do zwiększenia liczby aktywnych użytkowników dziennie i wyższego średniego współczynnika wizyt.

Profile bazowe pomagają prowadzić optymalizację po uruchomieniu aplikacji, ponieważ udostępniają typowe interakcje użytkowników, które poprawiają czas działania aplikacji już od pierwszego jej uruchomienia. Instruktażowa kompilacja AOT nie bazuje na urządzeniach użytkownika i można ją przeprowadzić raz dla każdej wersji na komputerze, a nie na urządzeniu mobilnym. Dzięki wysyłaniu wersji za pomocą profilu podstawowego optymalizacje aplikacji stają się dostępne znacznie szybciej niż w przypadku samego profili Cloud.

Gdy nie używasz profilu podstawowego, cały kod aplikacji jest skompilowany w pamięci przez JIT po zinterpretowaniu lub zapisywany w pliku odex w tle, gdy urządzenie jest bezczynne. Po zainstalowaniu lub zaktualizowaniu aplikacji jej obsługa nie jest optymalna od momentu jej pierwszego uruchomienia do zoptymalizowania nowych ścieżek kodu. Wiele aplikacji po optymalizacji zwiększa ich wydajność o około 30%.

Profile uruchamiania

Profile startowe są podobne do profili bazowych, ale różnica polega na tym, że są one używane w czasie kompilacji, a nie do optymalizacji na urządzeniu. Profil uruchamiania służy do optymalizacji układu pliku DEX w celu skrócenia czasu uruchamiania. Kod wskazany w profilu uruchamiania jest umieszczany w głównym pliku classes.dex, a inny kod jest umieszczany w osobnych plikach DEX. Przyspiesza to uruchamianie aplikacji, bo zmniejsza liczbę błędów strony. Więcej informacji o tym, jak profile uruchamiania i optymalizacje układu DEX mogą skrócić czas uruchamiania aplikacji, znajdziesz w artykule Profile uruchamiania i optymalizacje układu DEX.

Rozpocznij

Aby rozpocząć optymalizację wydajności w istniejącej aplikacji, przeczytaj artykuł Tworzenie profili podstawowych.

Łańcuch zależności udostępnia stabilne i rozwojowe wersje wersji. Aby wygenerować i zainstalować profil podstawowy, użyj podanych niżej obsługiwanych wersji wtyczki Androida do obsługi Gradle lub nowszej, biblioteki Macrobenchmark i instalatora profilu. Zależności te są wymagane w różnych momentach i współdziałają jako łańcuch narzędzi zapewniający optymalny profil podstawowy.

  • Wtyczka Androida do obsługi Gradle: com.android.tools.build:8.0.0
  • Biblioteka makroporównawczych: androidx.benchmark:benchmark-macro-junit4:1.2.4
  • Instalator profilu: androidx.profileinstaller:profileinstaller:1.3.1

Do tworzenia profili bazowych i zarządzania nimi zalecamy korzystanie z najnowszej wersji AGP. Oto główne funkcje dostępne w różnych wersjach pakietu AGP:

Wersja AGP Funkcje
8.3
  • Obsługa pełnego zestawu źródeł (moduły biblioteki): zadeklaruj wiele plików źródłowych profilu podstawowego i używaj katalogów opartych na wariantach, np. src/free/generated/baselineProfiles/baseline-prof1.txt, teraz zarówno w przypadku modułów biblioteki, jak i modułów aplikacji.
  • Profile podstawowe obejmują wycofane klasy.
8.2
  • Przepisywanie reguł R8: wersje D8 i R8 mogą przekształcić zrozumiałe dla człowieka reguły podstawowego i profilu uruchamiania, tak aby w pełni zarejestrować wszystkie reguły potrzebne do optymalizacji wydajności aplikacji. Zwiększa zasięg profilu podstawowego o około 30% i zwiększa wydajność aplikacji o około 15%.
  • Profile uruchamiania: wygeneruj ten nowy typ profilu podstawowego, aby informować o układzie kodu w DEX. Zwiększa wydajność uruchamiania o dodatkowe 15% lub znacznie zwiększa w przypadku dużych aplikacji.
z Androidem 8.0 Minimalna zalecana wersja: użyj wtyczki Gradle profilu podstawowego do generowania profili bazowych za pomocą pojedynczego zadania Gradle.
  • Obsługa katalogu pełnego zestawu źródeł (moduły aplikacji): zadeklaruj wiele plików źródłowych profilu podstawowego i używaj katalogów uwzględniających warianty, np. src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 Minimalna obsługiwana wersja: aplikacje mogą korzystać z profili podstawowych z bibliotek i udostępniać własny profil bazowy w pliku src/main/baseline-prof.txt.
  • Profile bazowe są prawidłowo spakowane podczas tworzenia pliku APK z pakietu aplikacji (numer problemu 230361284).
  • W przypadku aplikacji z więcej niż 1 plikiem .dex profile podstawowe są prawidłowo spakowane dla podstawowego pliku .dex.

Przykład generowania profilu

Poniżej znajdziesz przykładową klasę do tworzenia profilu podstawowego na potrzeby uruchamiania aplikacji, a także kilku zdarzeń nawigacji i przewijania za pomocą zalecanej biblioteki Macrobenchmark:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

W pełnym kontekście i szczegółach znajdziesz ten kod w przykładach wydajności na GitHubie.

Co uwzględnić?

Gdy używasz profili podstawowych w aplikacji, możesz uwzględnić kod uruchamiania aplikacji i typowe interakcje użytkowników, takie jak nawigacja między ekranami lub przewijanie. Możesz też zbierać informacje o całych przepływach, takich jak rejestracja, logowanie czy płatność. Każda ścieżka użytkownika, którą uznasz za kluczową, może przynieść korzyści dzięki profilom bazowym dzięki poprawie wydajności środowiska wykonawczego.

Jeśli testujesz różne podejścia do poprawy skuteczności, rozważ dodanie profili bazowych dla obu grup eksperymentu. Ułatwi Ci to interpretację wyników, ponieważ zapewni to, że wszyscy użytkownicy regularnie korzystają z skompilowanego kodu.

Biblioteki mogą tworzyć własne profile bazowe i wysyłać im wersje, aby zwiększyć wydajność aplikacji. Zapoznaj się na przykład z sekcją Użyj profilu podstawowego w wydajności Jetpack Compose.

Jak działają profile podstawowe

Tworząc aplikację lub bibliotekę, zastanów się nad zdefiniowaniem profili podstawowych, aby uwzględnić typowe interakcje użytkowników, gdy czas renderowania lub opóźnienia są ważne. Działa to w następujący sposób:

  1. Zrozumiałe dla człowieka reguły profilu są generowane dla aplikacji i kompilowane w postać binarną. Znajdziesz je w assets/dexopt/baseline.prof. Następnie możesz w zwykły sposób przesłać pakiet aplikacji na Androida do Google Play.

  2. Google Play przetwarza profil i wysyła go bezpośrednio do użytkowników wraz z plikiem APK. Podczas instalacji ART wykonuje kompilację AOT metod w profilu, dzięki czemu działają one szybciej. Jeśli profil zawiera metody używane podczas uruchamiania aplikacji lub renderowania ramek, czas uruchamiania może być krótszy i mniej zacinane.

  3. Ten proces współdziała z agregacją profili Cloud, aby dostosowywać wydajność na podstawie rzeczywistego wykorzystania aplikacji w danym okresie.

Rysunek 1. Ten diagram przedstawia przepływ pracy profilu podstawowego od przesyłania do użytkownika końcowego oraz jego związek z profilami Cloud.

Profile w chmurze

Profile w chmurze stanowią dodatkową formę PGO – agregowane przez Sklep Google Play i rozpowszechniane w celu kompilacji czasu instalacji – w połączeniu z profilami podstawowymi.

Chociaż profile Cloud bazują na rzeczywistych interakcjach użytkowników z aplikacją, ich dostępność może potrwać od kilku godzin do kilku dni po jej rozpowszechnieniu. Dopóki profile nie zostaną w pełni rozproszone, wydajność aplikacji nie będzie optymalna w przypadku użytkowników nowych lub zaktualizowanych aplikacji. Ponadto CloudProfile obsługują tylko urządzenia z Androidem 9 (poziom interfejsu API 28) lub wyższym i dobrze skalują się tylko w przypadku aplikacji, które mają odpowiednio dużą bazę użytkowników.

Działanie kompilacji w różnych wersjach Androida

Wersje platformy Androida korzystają z innych metod kompilacji aplikacji, z których każda wiąże się z odpowiednim spadkiem wydajności. Profile podstawowe usprawniają poprzednie metody kompilacji, ponieważ zapewniają profil dla wszystkich instalacji.

Wersja Androida Metoda kompilacji Optymalizacja
od 5 do 6 (poziom API 21–23) Pełna data AOT Podczas instalacji cała aplikacja jest optymalizowana, co przekłada się na długi czas oczekiwania w aplikacji, większe wykorzystanie pamięci RAM i miejsca na dysku oraz dłuższe wczytywanie kodu z dysku, co potencjalnie może wydłużyć czas uruchamiania „na zimno”.
od 7 do 8.1 (poziom API od 24 do 27) Częściowy AOT (profil podstawowy) Profile bazowe są instalowane przez androidx.profileinstaller przy pierwszym uruchomieniu, gdy moduł aplikacji określa tę zależność. ART może jeszcze bardziej to poprawić, dodając dodatkowe reguły profilu podczas używania aplikacji i kompilować je, gdy urządzenie jest bezczynne. Optymalizuje to miejsce na dysku i czas wczytywania kodu z dysku, skracając w ten sposób czas oczekiwania aplikacji.
9 (poziom API 28) i wyższy Częściowy AOT (wartość podstawowa + profil Cloud) Podczas instalowania aplikacji Google Play korzysta z profili podstawowych, aby optymalizować plik APK i profile Cloud (jeśli są dostępne). Po instalacji profile ART są przesyłane do Play, agregowane, a następnie przekazywane jako profile Cloud innym użytkownikom podczas instalowania lub aktualizowania aplikacji.

Znane problemy

Poniżej znajdziesz możliwe problemy i rozwiązania oraz problemy, których obecnie pracujemy nad sposobami obejścia problemu:

  • Generowanie profilu podstawowego nie jest obsługiwane na urządzeniach z Laboratorium Firebase, w tym na urządzeniach z Laboratorium zarządzanych przez Gradle (problem #285187547).

  • Aby skutecznie udostępniać profile bazowe bibliotek, użyj wtyczki Gradle profilu podstawowego w wersji 1.2.3 lub AGP w wersji 8.3 co najmniej (numer zgłoszenia: 313992099).

  • Jeśli wygenerujesz profile podstawowe za pomocą polecenia ./gradlew app:generateBaselineProfile, testy porównawcze w module testowym również zostaną uruchomione, a wyniki zostaną odrzucone. W takim przypadku możesz wygenerować tylko profile podstawowe, uruchamiając polecenie -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Naprawiliśmy ten problem w AGP 8.2.

  • Polecenie do generowania profili podstawowych dla wszystkich typów kompilacji – ./gradlew app:generateBaselineProfile – generuje tylko profile podstawowe dla typu kompilacji wersji. Naprawiliśmy ten problem w AGP 8.1.

  • Kanały dystrybucji aplikacji spoza Sklepu Google Play mogą nie obsługiwać używania profili podstawowych podczas instalacji. Użytkownicy aplikacji instalowanych za pomocą tych kanałów nie dostrzegają korzyści do czasu uruchomienia dexopt. Działa to zwykle z dnia na dzień.

  • Wewnętrzne udostępnianie aplikacji w Sklepie Play nie obsługuje profili podstawowych, ale ścieżka testu wewnętrznego już tak.

  • W przypadku niektórych urządzeń, takich jak urządzenia Huawei, optymalizacja baterii może zakłócać instalację profilu. Aby mieć pewność, że profile będą instalowane prawidłowo, wyłącz wszelkie optymalizacje baterii w testach porównawczych.

Dodatkowe materiały