Profile podstawowe zwiększają szybkość wykonywania kodu o około 30% od pierwszego uruchomienia, ponieważ pomijają etapy interpretacji i kompilacji 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ść dla każdego nowego użytkownika i każdej aktualizacji aplikacji. Ta optymalizacja oparta na 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 historiach użytkowników aplikacji 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 poza jej uruchamianiem, ponieważ zawierają typowe interakcje użytkowników, które poprawiają działanie aplikacji od pierwszego uruchomienia. Kompilacja AOT z przewodnikiem 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 stają się dostępne znacznie szybciej niż w przypadku korzystania z profili w chmurze tylko.
Jeśli nie używasz profilu podstawowego, cały kod aplikacji jest kompilowany w pamięci za pomocą kompilacji JIT 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 przyspieszenia uruchamiania, a nie do optymalizacji na urządzeniu. Aby dowiedzieć się więcej o tym, czym profile uruchamiania różnią się od profili podstawowych , 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 zrozumieć różnicę w konfiguracjach kompilacji wymaganych podczas generowania plików profili podstawowych i uruchamiania (np. baseline-prof.txt i startup-prof.txt) oraz 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 odpowiadały sygnaturom metod w 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 lub nowszych obsługiwanych wersji 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 wtyczki Androida do obsługi Gradle. Oto główne funkcje dostępne w różnych wersjach wtyczki Androida do obsługi Gradle:
| Wersja wtyczki Androida do obsługi Gradle | 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 oraz modułów aplikacji.
|
| 8.4 | Lokalne instalacje aplikacji w przypadku kompilacji, których nie można debugować, za pomocą narzędzia wiersza poleceń Gradle Wrapper lub Androida 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ł, wychodząc poza ograniczenia pojedynczej, stałej ścieżki (np. src/main/baseline-prof.txt) i umożliwiając używanie 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
Oto przykładowa klasa 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ć?
Używając 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ść. Wszystkie ścieżki użytkowników, które uznasz za krytyczne, mogą korzystać 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 ułatwić interpretację wyników, ponieważ wszyscy użytkownicy będą konsekwentnie korzystać ze 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 środowisko wykonawcze Androida (ART) przeprowadza kompilację AOT metod w profilu, dzięki czemu metody te działają 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 agregacją profili w chmurze, aby dostosowywać wydajność na podstawie rzeczywistego użycia 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 wtyczka Androida do obsługi Gradle kompiluje te czytelne dla człowieka reguły profilu do formatu binarnego – spakowanego jako baseline.prof w pliku APK lub AAB – który środowisko wykonawcze Androida 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 uruchamianiu, służą one różnym celom i wpływają na wydajność na różnych etapach:
Profil podstawowy
Plik profilu podstawowego zawiera obszerny 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ę optymalizacji opartej na profilu – 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ść. Środowisko wykonawcze Androida (ART) może to jeszcze 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.
Aby prawidłowo udostępniać profile podstawowe w bibliotekach, używaj wtyczki Gradle do obsługi profili podstawowych w wersji co najmniej 1.2.3 lub wtyczki Androida do obsługi Gradle w wersji co najmniej 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 wtyczce Androida do obsługi Gradle w wersji 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 wtyczce Androida do obsługi Gradle w wersji 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