Profile Baseline przyspieszają wykonywanie kodu o około 30% od pierwszego uruchomienia, ponieważ zapobiegają interpretacji i kompilowaniu just-in-time (JIT) w przypadku uwzględnionych ścieżek kodu.
Wysyłając profil podstawowy do aplikacji lub biblioteki, środowisko wykonawcze Android (ART) może zoptymalizować określone ścieżki kodu za pomocą kompilacji z wyprzedzeniem (AOT), co poprawia wydajność 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.
Te ulepszenia wydajności bezpośrednio przekładają się na lepsze wyniki biznesowe, takie jak utrzymanie użytkowników, transakcje i oceny. Więcej informacji o wpływie wyników na dane biznesowe znajdziesz w historiach Josh, Lyft, TikTok i Zomato.
Zalety profili podstawowych
Profile podstawowe sprawiają, że wszystkie interakcje użytkownika – np. uruchamianie aplikacji, poruszanie się między ekranami czy przewijanie treści – przebiegają płynniej od pierwszego uruchomienia. Dzięki zwiększeniu szybkości i czułości aplikacji profile podstawowe mogą zwiększać liczbę aktywnych użytkowników dziennie i średni wskaźnik powrotów.
Profile podstawowe ułatwiają optymalizację poza procesem uruchamiania aplikacji, ponieważ zapewniają typowe interakcje użytkowników, które usprawniają działanie aplikacji już od pierwszego uruchomienia. Kompilacja AOT z instrukcjami nie bazuje na urządzeniach użytkowników i można ją wykonać raz na daną wersję na komputerze dla programistów, a nie na urządzeniu mobilnym. Dzięki udostępnianiu wersji z profilem bazowym optymalizacje aplikacji są dostępne znacznie szybciej niż w przypadku korzystania tylko z profili w chmurze.
Gdy nie używasz profilu Baseline, cały kod aplikacji jest kompilowany przez JIT w pamięci po zinterpretowaniu lub zapisywany w pliku odex
w tle, gdy urządzenie jest bezczynne. Po zainstalowaniu lub zaktualizowaniu aplikacji użytkownicy od razu ją uruchamiają, a jej obsługa nie jest optymalna, aż do zoptymalizowania 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óżnią się tym, że są 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 z profilu startowego jest umieszczany w głównym pliku classes.dex
, a pozostały kod – w osobnych plikach DEX. Pozwala to skrócić czas uruchamiania aplikacji, zmniejszając liczbę błędów strony. Więcej informacji o tym, jak profile startowe i optymalizacje układu DEX mogą poprawić czas uruchamiania aplikacji, znajdziesz w artykule Optymalizacja układu DEX i profile startowe.
Rozpocznij
Aby zacząć optymalizować działanie istniejącej aplikacji, zapoznaj się z artykułem Tworzenie profili bazowych.
Minimalna zalecana liczba wersji stabilnych
Łańcuch zależności zapewnia wersje stabilne i rozwojowe. Aby wygenerować i zainstalować profil Baseline, użyj następujących obsługiwanych wersji lub nowszych wtyczki wtyczki Android do obsługi Gradle, biblioteki Macrobenchmark i instalatora profili. Zależności te są wymagane w różnym czasie i stanowią łańcuch narzędzi, który pozwala utworzyć optymalny profil bazowy.
- Wtyczka Androida do obsługi Gradle:
com.android.tools.build:8.0.0
- Biblioteka makrobenchmarków:
androidx.benchmark:benchmark-macro-junit4:1.3.3
- Instalator profilu:
androidx.profileinstaller:profileinstaller:1.4.1
Do tworzenia profili referencyjnych i zarządzania nimi zalecamy korzystanie z najnowszej wersji AGP. 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ędzia wiersza poleceń Gradle lub zainstalowanych profili podstawowych w Android Studio, dzięki czemu wydajność lokalnej kompilacji wersji jest bardziej zgodna z wydajnością w środowisku produkcyjnym. Ta aktualizacja nie ma wpływu na wydajność produkcyjną profili podstawowych. |
8.3 |
|
8.2 |
|
z Androidem 8.0 | Minimalna zalecana wersja: użyj wtyczki Gradle do generowania profili referencyjnych za pomocą pojedynczego zadania Gradle.
|
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 .
|
Przykład generowania profilu
Poniżej znajdziesz przykładową klasę do tworzenia profilu podstawowego na potrzeby uruchamiania aplikacji, a także kilka zdarzeń nawigacji i przewijania korzystających z 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()
}
}
}
Kod ten możesz zobaczyć w pełnym kontekście i bardziej szczegółowo w naszych przykładach wydajności w serwisie GitHub.
Co uwzględnić?
Korzystając z profili bazowych w aplikacji, możesz uwzględnić kod uruchamiania aplikacji i typowe interakcje z użytkownikiem, takie jak nawigacja między ekranami czy przewijanie. Możesz też zbierać całe procesy, takie jak rejestracja, logowanie czy płatność. Profile podstawowe mogą poprawić wydajność w czasie działania dowolnej ścieżki użytkownika, która jest dla Ciebie kluczowa.
Jeśli eksperymentujesz z różnymi podejściami do zwiększania skuteczności, rozważ uwzględnienie profili podstawowych w przypadku obu odmian eksperymentu. Dzięki temu wyniki będą łatwiejsze do interpretacji, 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. Zobacz na przykład artykuł o korzystaniu z profilu Baseline w wydajności Jetpack Compose.
Jak działają profile podstawowe
Podczas tworzenia aplikacji lub biblioteki rozważ zdefiniowanie profili bazowych, aby uwzględnić typowe interakcje użytkowników, w przypadku których czas renderowania lub opóźnienie są ważne. Działa to w następujący sposób:
Zrozumiałe dla człowieka reguły dotyczące profilu są generowane dla Twojej aplikacji i scalane w formę binarną w aplikacji. Znajdziesz je tutaj:
assets/dexopt/baseline.prof
. Następnie możesz przesłać AAB do Google Play w zwykły sposób.Google Play przetwarza profil i wysyła go bezpośrednio do użytkowników wraz z plikiem APK. Podczas instalacji ART przeprowadza kompilację AOT metod w profilu, co przyspiesza ich działanie. Jeśli profil zawiera metody używane podczas uruchamiania aplikacji lub podczas renderowania ramek, może to skrócić czas uruchamiania i zmniejszyć liczbę zakłóceń.
Ten proces współpracuje z zbiorczym raportem Cloud Profiles, aby dostosowywać wydajność na podstawie rzeczywistego użytkowania aplikacji w czasie.
Profile w Google Cloud
Profile Cloud oferują dodatkową formę PGO – agregowaną przez Sklep Google Play i rozpowszechnianą na potrzeby kompilacji czasu instalacji – razem z profilami podstawowymi.
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ść. Dopóki profile nie zostaną w pełni rozpowszechnione, wydajność aplikacji będzie nieoptymalna dla użytkowników nowych lub zaktualizowanych aplikacji. Co więcej, Profile w chmurze obsługują tylko urządzenia z Androidem w wersji 9 (poziom interfejsu API 28) lub nowszej i skalują się tylko w przypadku aplikacji, które mają wystarczająco dużą bazę użytkowników.
Kompilowanie w różnych wersjach Androida
Wersje na platformie Android korzystają z różnych metod kompilacji aplikacji, z których każda ma odpowiednią wydajność. Profile podstawowe stanowią ulepszenie poprzednich metod kompilacji, ponieważ zapewniają profil dla wszystkich instalacji.
Wersja Androida | Metoda kompilacji | Metoda optymalizacji |
---|---|---|
Od 5 do 6 (poziom API 21–23) | Pełne AOT | Podczas instalacji cała aplikacja jest optymalizowana, co wydłuża czas oczekiwania na korzystanie z aplikacji, zwiększa wykorzystanie pamięci RAM i miejsca na dysku oraz wydłuża czas wczytywania kodu z dysku, co może wydłużyć czas uruchamiania aplikacji „na zimno”. |
7 do 8.1 (poziom interfejsu API 24 do 27) | Częściowe tworzenie obiektu AOT (profil podstawowy) | Profile bazowe są instalowane przez androidx.profileinstaller przy pierwszym uruchomieniu, gdy moduł aplikacji zdefiniuje tę zależność. ART może jeszcze bardziej to usprawnić, dodając kolejne reguły profilu podczas korzystania z aplikacji i kompilując je, gdy urządzenie jest bezczynne. Pozwala to zoptymalizować wykorzystanie miejsca na dysku i czas wczytywania kodu z dysku, co skraca czas oczekiwania na uruchomienie aplikacji. |
9 (poziom 28 interfejsu API) lub wyższy | Częściowy AOT (punkt odniesienia + profil w Google Cloud) | Podczas instalowania aplikacji Google Play używa profili podstawowych do optymalizowania plików APK i profilów w chmurze (jeśli są dostępne). Po instalacji profile ART są przesyłane do Google Play, agregowane i udostępniane jako profile Cloud innym użytkownikom, którzy instalują lub aktualizują aplikację. |
Znane problemy
Poniżej znajdziesz możliwe problemy i rozwiązania, a także problemy, których sposoby obejścia są stale wprowadzane:
Generowanie profilu podstawowego może się nie udać z powodu ustawień uprawnień na niektórych urządzeniach, w tym na urządzeniach OnePlus. Aby obejść ten problem, wyłącz opcję Wyłącz monitorowanie uprawnień w ustawieniach Opcji programisty.
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 nr 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 wygenerujesz profile podstawowe za pomocą polecenia
./gradlew app:generateBaselineProfile
, testy porównawcze w module testowym również będą uruchamiane, a wyniki będą odrzucane. W takim przypadku możesz wygenerować tylko profile podstawowe, uruchamiając polecenie za pomocą polecenia-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
. Ten problem został rozwiązany w wersji AGP 8.2.Polecenie do wygenerowania profili podstawowych dla wszystkich typów kompilacji (
./gradlew app:generateBaselineProfile
) generuje tylko profile bazowe dla typu kompilacji wersji. Ten problem został rozwiązany w wersji AGP 8.1.Profile podstawowe podczas instalacji mogą nie obsługiwać kanałów dystrybucji aplikacji spoza Sklepu Google Play. Użytkownicy aplikacji zainstalowanych przy użyciu tych kanałów nie widzą korzyści, dopóki nie uruchomi się dexopt w tle, co zapewne z dnia na dzień.
Udostępnianie aplikacji w Sklepie Play nie obsługuje profili podstawowych, ale ścieżka testu wewnętrznego już tak.
Optymalizacja baterii na niektórych urządzeniach, takich jak urządzenia Huawei, może zakłócać instalację profilu. Aby mieć pewność, że profile są prawidłowo instalowane, wyłącz wszelkie optymalizacje baterii na urządzeniach testowych.
Dodatkowe materiały
Polecane dla Ciebie
- Uwaga: tekst linku wyświetla się, gdy JavaScript jest wyłączony
- Utwórz profile Baseline {:#Creation-profile-rules}
- Tworzenie i pomiar profili bazowych bez testu porównawczego
- Optymalizacja układu DEX i profile uruchamiania