Profile podstawowe przyspieszają wykonywanie kodu o około 30% od pierwszego uruchomienia, ponieważ eliminują kroki interpretacji i kompilacji just-in-time (JIT) w przypadku uwzględnionych ścieżek kodu.
Dzięki profilowi podstawowemu w aplikacji lub bibliotece środowisko wykonawcze Androida (ART) może optymalizować określone ścieżki kodu za pomocą kompilacji AOT, co zwiększa wydajność w przypadku każdego nowego użytkownika i każdej aktualizacji aplikacji. Optymalizacja z użyciem profilu (PGO) pozwala aplikacjom optymalizować uruchamianie, zmniejszać zacięcia interakcji i poprawiać ogólną wydajność środowiska wykonawczego dla użytkowników od pierwszego uruchomienia.
Te ulepszenia wydajności bezpośrednio przekładają się na lepsze wskaźniki biznesowe, takie jak utrzymanie użytkowników, transakcje i oceny. Więcej informacji o tym, jak wydajność wpływa na wskaźniki biznesowe, znajdziesz w artykułach o firmach Josh, Lyft, TikTok i Zomato.
Korzyści z profili podstawowych
Profile podstawowe umożliwiają wstępną kompilację kodu w przypadku krytycznych interakcji użytkowników, takich jak uruchamianie aplikacji, przechodzenie między ekranami czy przewijanie treści. Dzięki temu działają one płynniej od pierwszego uruchomienia. Zwiększając szybkość i responsywność aplikacji, profile podstawowe mogą zwiększyć liczbę aktywnych użytkowników dziennie i średni wskaźnik powrotu.
Profile podstawowe pomagają optymalizować działanie aplikacji nie tylko podczas uruchamiania, ale też w przypadku typowych interakcji użytkowników, co poprawia działanie aplikacji od pierwszego uruchomienia. Kompilacja AOT z użyciem profilu nie zależy od urządzeń użytkowników i można ją przeprowadzić raz na wersję na komputerze używanym do programowania zamiast na urządzeniu mobilnym. Dzięki udostępnianiu wersji z a profilem podstawowym optymalizacje aplikacji są dostępne znacznie szybciej niż w przypadku korzystania z profili w chmurze tylko.
Gdy nie używasz profilu podstawowego, cały kod aplikacji jest kompilowany JIT w pamięci po interpretacji lub zapisywany w pliku odex w tle, gdy urządzenie jest bezczynne. Po zainstalowaniu lub zaktualizowaniu aplikacji użytkownicy mają suboptymalne wrażenia od pierwszego uruchomienia do momentu zoptymalizowania nowych ścieżek kodu.
Wiele aplikacji po optymalizacji odnotowuje wzrost wydajności o około 30%.
Profile uruchamiania
Profile uruchamiania są podobne do profili podstawowych, ale są używane w czasie kompilacji do optymalizacji układu DEX w celu skrócenia czasu uruchamiania, a nie do optymalizacji na urządzeniu. Aby dowiedzieć się więcej o różnicach między profilami uruchamiania a profilami podstawowymi, przeczytaj artykuł Porównanie profili podstawowych i profili uruchamiania. Więcej informacji o optymalizacji układu DEX znajdziesz w artykule Optymalizacje układu DEX i profile uruchamiania.
Rozpocznij
Aby rozpocząć optymalizację wydajności w istniejącej aplikacji, przeczytaj artykuł Tworzenie profili podstawowych.
Generowanie profilu a kompilacje wersji
Ważne jest, aby znać różnicę między konfiguracjami kompilacji wymaganymi podczas generowania plików profili podstawowych i uruchamiania (np. baseline-prof.txt i startup-prof.txt) a podczas tworzenia końcowego pliku APK wersji, który korzysta z tych profili.
Podczas generowania plików profili (np. benchmark):
Aby wygenerowane reguły profilu dokładnie pasowały do sygnatur metod w Twoim kodzie, musisz wyłączyć zaciemnianie i optymalizację (R8) w przypadku wariantu kompilacji używanego do generowania profilu. Ten wariant musi różnić się od wariantu kompilacji do publikacji, w którym włączone jest zaciemnianie i optymalizacja. Możesz to zrobić, ustawiając wartość isMinifyEnabled = false dla wariantu kompilacji generowania profilu. Jeśli nie używasz wtyczki Gradle do obsługi profili podstawowych, musisz też upewnić się, że zastosowano opcje -dontobfuscate i -dontoptimize. Wtyczka Gradle do obsługi profili podstawowych automatycznie obsługuje tę konfigurację.
Podczas tworzenia końcowego pliku APK wersji:
Kompilacja do publikacji powinna zawsze mieć ustawienie isMinifyEnabled = true, aby korzystać z zaciemniania kodu, minifikacji i optymalizacji. R8 automatycznie przepisuje reguły z niezaciemnionych plików profili, aby pasowały do zaciemnionego i zoptymalizowanego kodu w pliku APK wersji. Aby optymalizacja układu DEX
(sterowana przez profile uruchamiania) była skuteczna, aplikacja w wersji musi być
zaciemniona i używać R8 z włączonymi wszystkimi optymalizacjami.
Minimalne zalecane wersje stabilne
Łańcuch zależności udostępnia stabilne i rozwojowe wersje. Aby wygenerować i zainstalować profil podstawowy, użyj tych obsługiwanych wersji lub nowszych wtyczki Androida do obsługi Gradle, biblioteki Macrobenchmark i instalatora profili. Te zależności są wymagane w różnych momentach i współpracują ze sobą jako łańcuch narzędzi, aby umożliwić optymalny profil podstawowy.
- Wtyczka Androida do obsługi Gradle:
com.android.tools.build:8.0.0 - Biblioteka Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.4.1 - Instalator profili:
androidx.profileinstaller:profileinstaller:1.4.1
Do tworzenia profili podstawowych i zarządzania nimi zalecamy używanie najnowszej wersji AGP. Oto główne funkcje dostępne w różnych wersjach AGP:
| Wersja AGP | Funkcje |
|---|---|
| 9.1 |
Pełna obsługa katalogu zestawu źródeł (moduły biblioteki): oprócz katalogów uwzględniających warianty możesz też zadeklarować wiele plików źródłowych profili podstawowych o dowolnej nazwie, np. src/free/generated/baselineProfiles/baseline-prof1.txt, w przypadku modułów biblioteki i modułów aplikacji.
|
| 8.4 | Lokalne instalacje aplikacji w kompilacjach niepodlegających debugowaniu za pomocą narzędzia wiersza poleceń Gradle wrapper lub Android Studio instalują profile podstawowe, dzięki czemu wydajność lokalnej kompilacji wersji jest bardziej zbliżona do wydajności w środowisku produkcyjnym. Ta aktualizacja nie wpływa na wydajność profili podstawowych w środowisku produkcyjnym. |
| 8.3 |
|
| 8.2 |
|
| 8.0 | Minimalna zalecana wersja: użyj wtyczki Gradle do obsługi profili podstawowych, aby generować profile podstawowe za pomocą jednego zadania Gradle.
|
| 7.4 |
Minimalna obsługiwana wersja: aplikacje mogą korzystać z profili podstawowych
z bibliotek i udostępniać własny profil podstawowy w
src/main/baseline-prof.txt pliku.
|
Ustawienia źródła profilu uwzględniające warianty
Używając wtyczki Androida do obsługi Gradle (AGP) w wersji 8.0 w przypadku aplikacji i AGP w wersji 8.3 w przypadku bibliotek, możesz umieszczać reguły profili podstawowych w specjalnym katalogu zestawu źródeł, co pozwala wyjść poza ograniczenia pojedynczej, stałej ścieżki (np. src/main/baseline-prof.txt) i używać wielu plików.
Ułatwia to solidną obsługę wariantów, umożliwiając definiowanie odrębnych profili podstawowych dostosowanych do konkretnych wersji i typów kompilacji (np. za pomocą katalogów takich jak src/variant/baselineProfiles/), co zapewnia precyzyjne stosowanie reguł optymalizacji wydajności w przypadku każdego unikalnego pliku binarnego aplikacji lub biblioteki.
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:
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
uiAutomator {
// App startup journey.
startApp(PACKAGE_NAME)
// Find and click elements using the new DSL
onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
onElement { viewIdResourceName == "myLazyColumn" }.also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
pressBack()
}
}
}
}
Więcej informacji o używaniu biblioteki UI Automator do automatyzacji ścieżek użytkowników znajdziesz w artykule Pisanie testów automatycznych za pomocą UI Automator.
Ten kod w pełnym kontekście i więcej szczegółów znajdziesz w naszych przykładach dotyczących 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 czy przewijanie. Możesz też zbierać całe ścieżki, takie jak rejestracja, logowanie czy płatność. Każda ścieżka użytkownika, którą uznasz za krytyczną, może skorzystać z profili podstawowych, ponieważ poprawiają one wydajność środowiska wykonawczego.
Jeśli eksperymentujesz z różnymi sposobami zwiększania wydajności, rozważ uwzględnienie profili podstawowych w obu grupach eksperymentu. Dzięki temu możesz łatwiej interpretować wyniki, ponieważ masz pewność, że wszyscy użytkownicy korzystają z skompilowanego kodu.
Biblioteki mogą udostępniać własne profile podstawowe i dostarczać je z wersjami, aby zwiększać wydajność aplikacji. Na przykład przeczytaj sekcję Używanie profilu podstawowego w artykule Wydajność Jetpack Compose.
Jak działają profile podstawowe
Podczas tworzenia aplikacji lub biblioteki rozważ zdefiniowanie profili podstawowych, które obejmują typowe interakcje użytkowników, w przypadku których ważny jest czas renderowania lub opóźnienie. Jak działają:
Reguły profilu czytelne dla człowieka są generowane dla Twojej aplikacji i kompilowane do postaci binarnej w aplikacji. Możesz je znaleźć w
assets/dexopt/baseline.prof. Następnie możesz przesłać pakiet Android App Bundle (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, dzięki czemu te metody są wykonywane szybciej. Jeśli profil zawiera metody używane podczas uruchamiania aplikacji lub renderowania klatek, użytkownik może zauważyć krótszy czas uruchamiania i mniejsze zacięcia.
Ten proces współpracuje z agregacją profili w chmurze, aby dostosowywać wydajność na podstawie rzeczywistego użytkowania aplikacji w czasie.
Porównanie profili podstawowych i profili uruchamiania
Do definiowania i tworzenia plików profili używasz wtyczki Gradle do obsługi profili podstawowych.
Ta wtyczka jest powiązana z procesem kompilacji, a AGP kompiluje te zrozumiałe dla człowieka reguły profilu do formatu binarnego (spakowanego jako baseline.prof w pliku APK lub AAB), który ART może skutecznie wykorzystywać do kompilacji na urządzeniu, pod warunkiem że jest mniejszy niż 1,5 MB.
Utworzone pliki profili mają zwykle nazwy startup-prof.txt i baseline-prof.txt. Chociaż ich zawartość może czasami wyglądać podobnie, zwłaszcza jeśli skupiasz się głównie na startupie, służą one różnym celom i wpływają na wydajność na różnych etapach:
Profil podstawowy
Plik profilu podstawowego zawiera kompleksowy zestaw reguł, których środowisko wykonawcze Androida (ART) używa do wstępnej kompilacji często używanych ścieżek kodu, co optymalizuje wydajność aplikacji nie tylko podczas uruchamiania.
Plik profilu podstawowego jest zwykle nadzbiorem reguł znajdujących się w profilu uruchamiania. Ten plik zawiera wszystkie reguły wymagane do optymalizacji uruchamiania aplikacji (wygenerowane za pomocą zadania Gradle baselineProfile) oraz dodatkowe profile dla innych krytycznych ścieżek użytkowników. Na przykład przewijanie i przechodzenie między różnymi ekranami.
Te dodatkowe reguły inne niż uruchamianie są generowane niezależnie od wartości pola konfiguracji includeInStartupProfile.
Profil uruchamiania
Plik profilu uruchamiania zawiera reguły zoptymalizowane specjalnie pod kątem ścieżki uruchamiania aplikacji. Podczas kompilacji D8 konwertuje kod bajtowy Java na format DEX.
R8 używa następnie tego pliku do wpływania na układ plików DEX, dzięki czemu krytyczny kod uruchamiania jest umieszczany w głównym pliku DEX w celu szybszego wykonania. Zwykle należy ustawić wartość includeInStartupProfile na true tylko w przypadku scenariuszy testowych niezbędnych do początkowego wyświetlania aplikacji. Więcej informacji znajdziesz w artykule
Tworzenie profili uruchamiania.
Profile w chmurze
Profile w chmurze oferują dodatkową formę PGO – agregowaną przez Sklep Google Play i dystrybuowaną na potrzeby kompilacji w czasie instalacji – wraz z profilami podstawowymi.
Profile w chmurze są oparte na rzeczywistych interakcjach użytkowników z aplikacją, ale ich dystrybucja trwa kilka godzin lub dni po aktualizacji, co ogranicza ich dostępność. Do czasu pełnego rozpowszechnienia profili wydajność aplikacji jest suboptymalna dla użytkowników nowych lub zaktualizowanych aplikacji. Ponadto profile w chmurze obsługują tylko urządzenia z Androidem 9 (poziom interfejsu API 28) lub nowszym i dobrze skalują się tylko w przypadku aplikacji z wystarczająco dużą bazą użytkowników.
Działanie kompilacji w różnych wersjach Androida
Wersje platformy Androida używają różnych metod kompilacji aplikacji, z których każda ma odpowiedni kompromis w zakresie wydajności. Profile podstawowe ulepszają poprzednie metody kompilacji, ponieważ zapewniają profil dla wszystkich instalacji.
| Wersja Androida | Metoda kompilacji | Metoda optymalizacji |
|---|---|---|
| 5–6 (poziom interfejsu API 21–23) | Pełna kompilacja AOT | Cała aplikacja jest optymalizowana podczas instalacji, co powoduje długie czasy oczekiwania na użycie aplikacji, zwiększone zużycie pamięci RAM i miejsca na dysku oraz dłuższe czasy wczytywania kodu z dysku, co może zwiększyć czasy uruchamiania „na zimno”. |
| 7–8.1 (poziom interfejsu API 24–27) | Częściowa kompilacja AOT (profil podstawowy) | Profile podstawowe są instalowane przez androidx.profileinstaller przy pierwszym uruchomieniu, gdy moduł aplikacji definiuje tę zależność. ART może to jeszcze bardziej ulepszyć, dodając dodatkowe reguły profilu podczas korzystania z aplikacji i kompilując je, gdy urządzenie jest bezczynne. Optymalizuje to miejsce na dysku i czas wczytywania kodu z dysku, co skraca czas oczekiwania na aplikację. |
| 9 (poziom interfejsu API 28) i nowsze | Częściowa kompilacja AOT (profil podstawowy + profil w chmurze) | Google Play używa profili podstawowych podczas instalacji aplikacji do optymalizacji pliku APK i profili w chmurze (jeśli są dostępne). Po instalacji profile ART są przesyłane do Google Play, agregowane, a następnie udostępniane innym użytkownikom jako profile w chmurze, gdy instalują lub aktualizują aplikację. |
Znane problemy
Poniżej znajdziesz możliwe problemy i rozwiązania lub problemy, w przypadku których trwają prace nad obejściami:
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 Opcje programisty.
Generowanie profilu podstawowego nie jest obsługiwane na urządzeniach Laboratorium Firebase, w tym na urządzeniach Laboratorium zarządzanych przez Gradle (problem nr 285187547).
Aby prawidłowo udostępniać profile podstawowe w bibliotekach, używaj wtyczki Gradle do obsługi profili podstawowych w wersji 1.2.3 lub AGP w wersji 8.3 (problem nr 313992099).
Jeśli wygenerujesz profile podstawowe za pomocą polecenia
./gradlew app:generateBaselineProfile, uruchomią się też testy porównawcze w module testowym, a wyniki zostaną odrzucone. W takim przypadku możesz wygenerować tylko profile podstawowe, uruchamiając polecenie z opcją-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Ten problem został rozwiązany w AGP 8.2.Polecenie generowania profili podstawowych dla wszystkich rodzajów kompilacji –
./gradlew app:generateBaselineProfile– generuje profile podstawowe tylko dla rodzaju kompilacji do publikacji. Ten problem został rozwiązany w AGP 8.1.Kanały dystrybucji aplikacji inne niż Sklep Google Play mogą nie obsługiwać używania profili podstawowych podczas instalacji. Użytkownicy aplikacji zainstalowanych za pomocą tych kanałów nie zobaczą korzyści, dopóki nie zostanie uruchomiona optymalizacja dexopt w tle, co prawdopodobnie nastąpi w nocy.
Wewnętrzne udostępnianie aplikacji w Sklepie Play nie obsługuje profili podstawowych, ale obsługuje je ścieżka testów wewnętrznych.
Optymalizacje baterii na niektórych urządzeniach, np. Huawei, mogą zakłócać instalację profilu. Aby mieć pewność, że profile są instalowane skutecznie, wyłącz optymalizacje baterii na urządzeniach testowych.
Dodatkowe materiały
- Optymalizacje układu DEX i profile uruchamiania
- Poprawa wydajności aplikacji dzięki profilom podstawowym
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy język JavaScript jest wyłączony.
- Tworzenie profili podstawowych {:#creating-profile-rules}
- Tworzenie i pomiar profili podstawowych bez użycia biblioteki Macrobenchmark
- Optymalizacje układu DEX i profile uruchamiania