Omówienie profili podstawowych

Profile bazowe zwiększają szybkość wykonywania kodu o około 30% w porównaniu z pierwszym uruchomieniem, ponieważ unikają interpretacji i czynności kompilacji w czasie wykonywania (JIT) dla uwzględnionych ścieżek kodu.

Przesyłając profil podstawowy w aplikacji lub bibliotece, środowisko wykonawcze Androida (ART) może zoptymalizować określony kod ścieżek konwersji za pomocą kompilacji AOT (AOT), zapewniającą skuteczność, dla każdego nowego użytkownika i każdej aktualizacji aplikacji. Optymalizacja na podstawie profilu (PGO) umożliwia aplikacjom optymalizację uruchamiania, zmniejszenie opóźnień interakcji i poprawę ogólnej wydajności w czasie działania od pierwszego uruchomienia.

W rezultacie wzrost skuteczności bezpośrednio przekłada się na lepsze wskaźniki biznesowe, takie jak takich jak utrzymanie użytkowników, transakcje i oceny. Więcej informacji na ten temat znajdziesz wpływa na dane biznesowe w artykułach Josh, Lyft, TikTok i Zomato.

Zalety profili podstawowych

Dzięki profilom podstawowym wszystkie interakcje użytkownika, takie jak uruchamianie aplikacji, poruszanie się między ekranami czy przewijanie treści, są płynniejsze już od pierwszego uruchomienia. Zwiększając szybkość i responsywność aplikacji, Profile podstawowe mogą prowadzić do zwiększenia liczby aktywnych użytkowników dziennie i wyższego średniego wyniku współczynnik ponownych wizyt.

Profile podstawowe pomagają w optymalizacji wykraczającej poza uruchamianie aplikacji, ponieważ zapewniają wspólne interakcji użytkowników, które usprawniają czas działania aplikacji już od pierwszego uruchomienia. AOT z przewodnikiem kompilacja nie wymaga urządzeń użytkowników i można ją przeprowadzić raz na wersję na komputerze, a nie na urządzeniu mobilnym. Przez wysłanie wersji za pomocą w przypadku profilu bazowego, optymalizacje aplikacji są dostępne znacznie szybciej niż w samych profilach Cloud.

Jeśli nie używasz profilu Baseline, cały kod aplikacji jest kompilowany w pamięci przez JIT po zinterpretowaniu lub zapisaniu w pliku odex w tle, gdy funkcja urządzenie jest nieaktywne. Po zainstalowaniu lub zaktualizowaniu aplikacji użytkownicy mają nieoptymalne od chwili jego pierwszego uruchomienia, aż po zoptymalizowanie nowych ścieżek kodu. Wiele aplikacji mierzy wzrost wydajności o około 30% po optymalizacji.

Profile uruchamiania

Profile startowe są podobne do profili podstawowych, ale różnica polega na są używane podczas kompilowania, a nie do optymalizacji na urządzeniu. Start-up jest używany do optymalizacji układu pliku DEX w celu skrócenia czasu uruchamiania. Kod wskazany w profilu startowym jest umieszczany w podstawowym elemencie classes.dex. a pozostały kod – w osobnych plikach DEX. Pozwala to skrócić czas uruchamiania przez zmniejszenie liczby błędów strony podczas uruchamiania aplikacji. Aby dowiedzieć się więcej o: jak profile startowe i optymalizacje układu DEX mogą skrócić czas uruchamiania aplikacji Więcej informacji: Optymalizacje i uruchamianie układu DEX profili firm.

Rozpocznij

Aby rozpocząć optymalizację wydajności dotychczasowej aplikacji, zapoznaj się z sekcją Tworzenie punktu odniesienia Profile.

Łańcuch zależności zapewnia wersje stabilne i rozwojowe. Do wygenerować i zainstalować profil Baseline, użyć następujących obsługiwanych wersji lub wtyczki Androida do obsługi Gradle, biblioteki Macrobenchmark i programu Instalator profilu. Zależności te są wymagane w różnym czasie i stanowią podstawę łańcuch narzędzi, aby włączyć optymalny profil podstawowy.

  • Wtyczka Androida do obsługi Gradle: com.android.tools.build:8.0.0
  • Biblioteka analizy porównawczej: androidx.benchmark:benchmark-macro-junit4:1.3.0
  • Instalator profilu: androidx.profileinstaller:profileinstaller:1.3.1

Do utworzenia punktu odniesienia i zarządzania nim zalecamy używanie najnowszej wersji AGP Profile. Oto główne funkcje dostępne w różnych wersjach AGP:

Wersja AGP Funkcje
8.4 Lokalne instalacje aplikacji z kompilacji, których nie można debugować, za pomocą Narzędzie wiersza poleceń kodu Gradle lub Android Studio, instalując profile Baseline, lokalnej wersji kompilacji jest bardziej zbliżone do wersji produkcyjnej. Ten nie ma wpływu na wydajność produkcyjną profili podstawowych.
8.3
  • Pełna obsługa katalogu zestawu źródeł (moduły biblioteki): deklaruj teraz kilka plików źródłowych profilu podstawowego i używaj katalogów obsługujących warianty, takich jak src/free/generated/baselineProfiles/baseline-prof1.txt, zarówno w przypadku modułów biblioteki, jak i modułów aplikacji.
  • Profile podstawowe obejmują wyluzowane zajęcia.
8.2
  • Przepisywanie reguł R8: D8 i R8 mogą przekształcać zrozumiałe dla człowieka reguły bazowe i profilu startowego pozwalają na pełne przechwycenie wszystkie reguły potrzebne do optymalizacji wydajności aplikacji. Wzrosty Pokrycie metod w profilu bazowym o ok. 30% i zwiększenie aplikacji o około 15%.
  • Profile startupów: wygeneruj ten nowy typ profilu bazowego, aby uwzględnić układ w pliku DEX. Zwiększa wydajność startupów o dodatkowy Ok. 15% lub znacznie więcej w przypadku dużych aplikacji.
z Androidem 8.0 Minimalna zalecana wersja: użyj wtyczki Gradle profilu Baseline do generowania profili podstawowych za pomocą pojedynczego zadania Gradle.
  • Obsługa katalogów w pełnym zestawie źródeł (moduły aplikacji): zadeklaruj wiele profili podstawowych. w plikach źródłowych 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ępnić własny profil podstawowy src/main/baseline-prof.txt.
  • Profile podstawowe są prawidłowo spakowane podczas tworzenia Plik APK z pakietu aplikacji (numer problemu 230361284).
  • W przypadku aplikacji z więcej niż 1 plikiem .dex, punkt odniesienia Profile dla głównego zasobu (.dex) są prawidłowo spakowane .

Przykład generowania profilu

Poniżej znajduje się przykładowa klasa tworzenia profilu podstawowego na potrzeby uruchamiania aplikacji: oraz kilka zdarzeń nawigacji i przewijania za pomocą Makroanaliza biblioteka:

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

Pełny kontekst i szczegółowy opis kodu znajdziesz w przykłady wydajności GitHub.

Co uwzględnić?

Jeśli używasz profili podstawowych w aplikacji, możesz dołączyć kod uruchamiania aplikacji oraz typowe interakcje użytkowników, takie jak nawigacja między ekranami lub przewijanie. Dostępne opcje Gromadzić też całe procesy, takie jak rejestracja, logowanie czy płatność. Dowolny użytkownik ścieżek, które uważasz za kluczowe, mogą skorzystać z profili podstawowych dzięki ulepszeniu wydajność działania w czasie działania.

Jeśli eksperymentujesz z różnymi metodami zwiększania skuteczności, warto uwzględnić profile podstawowe w obu grupach eksperymentu. Dzięki temu wyniki łatwiej będzie interpretować, ponieważ wszyscy użytkownicy będą uruchamiać skompilowany kod.

Biblioteki mogą udostępniać własne profile bazowe i przesyłać je wraz z wersjami, aby poprawić wydajność aplikacji. Przykładem może być sekcja Korzystanie z profilu bazowego w Jetpack Compose.

Jak działają profile podstawowe

Podczas tworzenia aplikacji lub biblioteki warto rozważyć zdefiniowanie profili podstawowych, obejmują typowe interakcje użytkowników, w przypadku których ważny jest czas renderowania i opóźnienia. Oto jak to działa:

  1. Zrozumiałe dla człowieka reguły dotyczące profilu są generowane dla Twojej aplikacji i scalane w w postaci binarnej. 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 plik APK. Podczas instalacji ART wykonuje kompilację AOT metod podanych w dzięki czemu metody te działają szybciej. Jeśli profil zawiera metody używane podczas uruchamiania aplikacji lub podczas renderowania klatek, użytkownik może zauważyć szybsze uruchamianie i mniejsze zacięcia.

  3. Ten proces współpracuje z agregacją profili Cloud w celu dostrajania wydajność przy użyciu aplikacji na podstawie rzeczywistego użytkowania w danym okresie.

Rysunek 1. Schemat pokazujący profil bazowy proces, od przesyłania po dostarczanie do użytkownika, oraz jego związek do profili Cloud.

Profile Cloud

Profile w chmurze to dodatkowa forma PGO (zagregowana według Google Play) Przechowuj i rozpowszechniaj na potrzeby kompilacji czasu instalacji – razem z punktem odniesienia Profile.

Chociaż profile w Cloud są tworzone na podstawie rzeczywistych interakcji użytkowników z aplikacją, ich dystrybucja zajmuje od kilku godzin do kilku dni, co ogranicza ich dostępność. Do momentu pełnego rozpowszechnienia profili aplikacja wydajność nie jest optymalna w przypadku użytkowników nowych lub zaktualizowanych aplikacji. Poza tym Google Cloud Profile obsługują tylko urządzenia z Androidem 9 (poziom interfejsu API 28) lub i dobrze skalować się tylko w przypadku aplikacji z wystarczająco dużą bazą użytkowników.

Kompilowanie w różnych wersjach Androida

Wersje na platformie Android korzystają z różnych metod kompilacji aplikacji. W każdej z nich w odpowiednim stopniu wydajności. Profile podstawowe są lepsze od poprzednich metod kompilacji, tworząc profil dla wszystkich instalacji.

Wersja Androida Metoda kompilacji Podejście do optymalizacji
5–6 (poziom interfejsu API 21–23) Pełne AOT Cała aplikacja jest zoptymalizowana podczas instalacji, co daje długie czasy oczekiwania na użycie zwiększoną ilość pamięci RAM wykorzystanie miejsca na dysku oraz dłuższy czas wczytywania kodu z dysku, potencjalnie zwiększenie liczby uruchomień „na zimno” razy.
Od 7 do 8.1 (interfejs API poziomy 24–27) Częściowy AOT (wartość bazowa) Profil) Profile podstawowe są zainstalowane przez: androidx.profileinstaller przy pierwszym uruchomieniu, Ten moduł zależności. reklamy ART mogą być lepsze o to dalej, dodając dodatkowe reguły profilu podczas używania aplikacji, i skompilować je, gdy urządzenie jest nieaktywne. Ten optymalizuje pod kątem miejsca na dysku i godzina na wczytanie kodu i w ten sposób ograniczyć ilość miejsca na dysku, czas oczekiwania na aplikację.
9 (poziom 28 interfejsu API) lub wyższy Częściowy AOT (punkt odniesienia + profil Cloud) Google Play używa profili podstawowych podczas instalacji zoptymalizuj pakiet APK i usługę Cloud profile, jeśli są dostępne. Po instalacji ART profile są przesyłane do Odtworzenie i zebranie danych, a następnie udostępnione jako profile Cloud innym użytkownikom, zainstalować lub zaktualizować aplikację.

Znane problemy

Poniżej znajdziesz listę możliwych problemów i rozwiązań, w przypadku których występują Trwają prace nad sposobami obejścia tego problemu:

  • Wygenerowanie profilu podstawowego może się nie udać z powodu ustawień uprawnień dla niektórych urządzeń, w tym OnePlus. Aby obejść ten problem, wyłącz Wyłącz monitorowanie uprawnień w Opcjach programisty. ustawieniach.

  • Generowanie profilu podstawowego nie jest obsługiwane na urządzeniach z Laboratorium Firebase, w tym urządzenia z Laboratorium zarządzanego przez Gradle (numer problemu 285187547).

  • Aby udostępnić profile bazowe dla bibliotek, użyj wtyczki Gradle do profilu bazowego w wersji co najmniej 1.2.3 lub AGP 8.3 (problem #313992099).

  • Jeśli generujesz profile podstawowe za pomocą polecenia ./gradlew app:generateBaselineProfile, testy porównawcze w module testowym a jego wyniki są odrzucane. W takim przypadku możesz wygenerować tylko profile podstawowe, uruchamiając polecenie -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile Ten problem został rozwiązany w wersji AGP 8.2.

  • Polecenie do generowania profili podstawowych dla wszystkich typów kompilacji: ./gradlew app:generateBaselineProfile – generuje tylko profile podstawowe dla: typu kompilacji wersji. Ten problem został rozwiązany w wersji AGP 8.1.

  • Kanały dystrybucji aplikacji spoza Sklepu Google Play mogą nie obsługiwać użycia: Profile Baseline podczas instalacji. Użytkownicy aplikacji zainstalowanych za pomocą tych nie zauważysz korzyści, dopóki nie zostanie uruchomiona deksoptacja w tle, prawdopodobnie w nocy.

  • Wewnętrzne udostępnianie aplikacji w Sklepie Play nie obsługuje Profili Baseline; jednak ścieżka testu wewnętrznego co robi.

  • Optymalizowanie baterii w niektórych urządzeniach (np. urządzeniach Huawei) może zakłócać działanie aplikacji i zainstalować profil. Aby mieć pewność, że profile są zainstalowane wyłącz wszystkie optymalizacje baterii w urządzeniach testowych.

Dodatkowe materiały