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) w przypadku uwzględnionych ścieżek kodu.
Dzięki udostępnieniu profilu bazowego w aplikacji lub bibliotece środowisko uruchomieniowe Android (ART) może optymalizować określone ścieżki kodu za pomocą kompilacji z wyprzedzeniem (AOT), co zapewnia poprawę wydajności 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.
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 tym, jak wyniki wpływają na dane firmy, znajdziesz w historiach z 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. Dzięki zwiększeniu szybkości i szybkości reakcji aplikacji profile podstawowe mogą zwiększać liczbę aktywnych użytkowników dziennie i średni wskaźnik powracających wizyt.
Profile bazowe pomagają optymalizować działanie aplikacji po jej uruchomieniu, podając typowe interakcje użytkowników, które poprawiają czas działania aplikacji od pierwszego uruchomienia. Prowadzona przez użytkownika kompilacja AOT nie wymaga korzystania z urządzeń użytkowników i może być wykonywana raz na wersję na komputerze deweloperskim, 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.
Jeśli nie używasz profilu bazowego, cały kod aplikacji jest kompilowany w pamięci w trybie JIT po interpretacji lub zapisywany w pliku odex
w tle, gdy urządzenie jest nieaktywne. Po zainstalowaniu lub zaktualizowaniu aplikacji użytkownicy mogą odczuwać niewygodę od momentu jej uruchomienia po optymalizację nowych ścieżek kodu.
Wiele aplikacji po optymalizacji odnotowuje wzrost wydajności o około 30%.
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 zidentyfikowany w profilu startupu jest umieszczany w głównym pliku classes.dex
, a inny kod w osobnych plikach DEX. Dzięki temu skrócisz czas uruchamiania, zmniejszając liczbę błędów strony podczas uruchamiania aplikacji. Więcej informacji o tym, jak profile uruchamiania i optymalizacje układu DEX mogą skrócić czas uruchamiania aplikacji, znajdziesz w artykule Optymalizacje układu DEX i profile uruchamiania.
Rozpocznij
Aby zacząć optymalizować działanie istniejącej aplikacji, zapoznaj się z artykułem Tworzenie profili bazowych.
Minimalne zalecane wersje stabilne
Łańcuch zależności zapewnia wersje stabilne i rozwojowe. Aby wygenerować i zainstalować profil referencyjny, użyj tych obsługiwanych wersji lub nowszych wtyczki Android Gradle, biblioteki Macrobenchmark i instalatora profilu. Te zależności są wymagane w różnych momentach i działają razem jako zestaw narzędzi, aby umożliwić optymalny profil podstawowy.
- 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 | Instalacje lokalne aplikacji z wersji niedebuggowanych za pomocą narzędzi wiersza poleceń Gradle wrapper lub profili bazowych instalacji w Android Studio, dzięki czemu wydajność wersji lokalnej jest bardziej zbliżona do wersji produkcyjnej. Ta aktualizacja nie wpływa na skuteczność profili referencyjnych w środowisku produkcyjnym. |
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 |
Najwcześniejsza obsługiwana wersja: aplikacje mogą używać profili referencyjnych z bibliotek i zawierać własne profile referencyjne w pliku src/main/baseline-prof.txt .
|
Przykład generowania profilu
Poniżej znajduje się przykładowa klasa do tworzenia profilu podstawowego na potrzeby uruchamiania aplikacji, a także kilka zdarzeń nawigacji i przewijania z zalecaną biblioteką 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()
}
}
}
Ten kod wraz z całym kontekstem i dodatkowymi informacjami znajdziesz w przykładach kodu na GitHubie.
Co uwzględnić?
Korzystając z profili bazowych w aplikacji, możesz uwzględnić kod uruchamiania aplikacji i typowe interakcje użytkownika, takie jak nawigacja między ekranami czy przewijanie. Możesz też zbierać dane z całych procesów, np. rejestracji, logowania czy płatności. 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. Przykładem może być sekcja Korzystanie z profilu bazowego w 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. Oto jak to działa:
W aplikacji generowane są czytelne dla człowieka reguły profilu, które są kompilowane w aplikacji w postaci binarnej. Znajdziesz je w pliku
assets/dexopt/baseline.prof
. Następnie możesz przesłać AAB do Google Play w zwykły sposób.Google Play przetwarza profil i przesyła go bezpośrednio do użytkowników wraz z pakietem APK. Podczas instalacji ART wykonuje kompilację AOT metod w profilu, dzięki czemu są one wykonywane szybciej. Jeśli profil zawiera metody używane podczas uruchamiania aplikacji lub renderowania klatek, użytkownik może zauważyć szybsze uruchamianie i mniejsze zacięcia.
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 w chmurze stanowią dodatkową formę PGO – są agregowane przez Google Play Store i rozprowadzane w ramach kompilacji w czasie instalacji – razem z Profilem bazowym.
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
Różne wersje platformy Androida korzystają z różnych metod kompilacji aplikacji, z których każda ma odpowiedni kompromis pod względem wydajności. Profile bazowe są lepsze od poprzednich metod kompilacji, ponieważ zawierają profil wszystkich instalacji.
Wersja Androida | Metoda kompilacji | Podejście do optymalizacji |
---|---|---|
5 do 6 (poziom API 21 do 23) | Pełny AOT | Cała aplikacja jest optymalizowana podczas instalacji, co powoduje długi czas oczekiwania na uruchomienie aplikacji, zwiększone wykorzystanie pamięci RAM i miejsca na dysku oraz dłuższy czas wczytywania kodu z dysku, co może wydłużać czas uruchamiania aplikacji po wyłączeniu. |
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 zwiększyć wydajność, dodając dodatkowe reguły profilu podczas korzystania z aplikacji i skompilowanie ich, gdy urządzenie jest nieaktywne. 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 zainstalowaniu aplikacja przesyła profile do Google Play, agreguje je, a następnie udostępnia jako profile w chmurze innym użytkownikom, gdy instalują lub aktualizują aplikację. |
Znane problemy
Poniżej znajdziesz możliwe problemy i ich rozwiązania lub problemy, w przypadku których trwają prace nad obejściem:
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 Laboratorium Firebase, w tym na urządzeniach zarządzanych przez Gradle (problem 285187547).
Aby udostępnić profile bazowe dla bibliotek, użyj wtyczki Gradle do profili bazowych w wersji co najmniej 1.2.3 lub AGP 8.3 (problem #313992099).
Jeśli wygenerujesz profile bazowe za pomocą polecenia
./gradlew app:generateBaselineProfile
, punkty odniesienia w module testowym zostaną również uruchomione, a ich wyniki zostaną odrzucone. W takim przypadku możesz wygenerować tylko profile referencyjne, wykonując polecenie z opcją-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
. Ten problem został rozwiązany w wersji AGP 8.2.Polecenie służące do generowania profili podstawowych dla wszystkich typów kompilacji (
./gradlew app:generateBaselineProfile
) generuje profile podstawowe tylko dla kompilacji wersji. Ten problem został rozwiązany w wersji AGP 8.1.Kanały dystrybucji aplikacji inne niż Sklep Google Play mogą nie obsługiwać profili podstawowych podczas instalacji. Użytkownicy aplikacji zainstalowanych za pomocą tych kanałów nie widzą korzyści, dopóki nie zostanie uruchomiony dexopt w tle, co prawdopodobnie nastąpi w nocy.
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 zapewnić skuteczne instalowanie profili, na urządzeniach testowych wyłącz wszelkie optymalizacje baterii.
Dodatkowe materiały
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy obsługa JavaScript jest wyłączona
- Tworzenie profili podstawowych {:#creating-profile-rules}
- Tworzenie i mierzenie profili referencyjnych bez Macrobenchmark
- Optymalizacja układu DEX i profile uruchamiania