Profile bazowe przyspieszają wykonywanie kodu o około 30% od pierwszego uruchomienia dzięki unikaniu interpretacji i kroków kompilacji just-in-time (JIT) w przypadku uwzględnionych ścieżek kodu.
Przesyłając profil podstawowy w aplikacji lub bibliotece, środowisko wykonawcze Androida (ART) może optymalizować określone ścieżki kodu przez kompilację z wyprzedzeniem (AOT) w celu poprawy wydajności w przypadku każdego nowego użytkownika i każdej aktualizacji aplikacji. Ta optymalizacja profilowa z pomocą profilu umożliwia aplikacjom optymalizowanie uruchamiania, ograniczanie zaśmiecania się interakcji i poprawę ogólnej wydajności środowiska wykonawczego u użytkowników już od pierwszego wprowadzenia na rynek.
Te wzrosty skuteczności bezpośrednio przekładają się na lepsze dane biznesowe, takie jak utrzymanie użytkowników, transakcje i oceny. Więcej informacji o wpływie wydajności na dane biznesowe znajdziesz w artykułach Josh, Lyft, TikTok i Zomato.
Zalety profili podstawowych
Profile bazowe usprawniają wszystkie interakcje użytkowników, np. uruchamianie aplikacji, poruszanie się między ekranami czy przewijanie treści, już przy pierwszym uruchomieniu. Zwiększając szybkość i czas reakcji aplikacji, profile bazowe mogą przyczynić się do zwiększenia liczby aktywnych użytkowników dziennie i wyższego średniego współczynnika wizyt.
Profile bazowe pomagają prowadzić optymalizację po uruchomieniu aplikacji, ponieważ udostępniają typowe interakcje użytkowników, które poprawiają czas działania aplikacji już od pierwszego jej uruchomienia. Instruktażowa kompilacja AOT nie bazuje na urządzeniach użytkownika i można ją przeprowadzić raz dla każdej wersji na komputerze, a nie na urządzeniu mobilnym. Dzięki wysyłaniu wersji za pomocą profilu podstawowego optymalizacje aplikacji stają się dostępne znacznie szybciej niż w przypadku samego profili Cloud.
Gdy nie używasz profilu podstawowego, cały kod aplikacji jest skompilowany w pamięci przez JIT po zinterpretowaniu lub zapisywany w pliku odex
w tle, gdy urządzenie jest bezczynne. Po zainstalowaniu lub zaktualizowaniu aplikacji jej obsługa nie jest optymalna od momentu jej pierwszego uruchomienia do zoptymalizowania nowych ścieżek kodu.
Wiele aplikacji po optymalizacji zwiększa ich wydajność o około 30%.
Profile uruchamiania
Profile startowe są podobne do profili bazowych, ale różnica polega na tym, że są one 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 wskazany w profilu uruchamiania jest umieszczany w głównym pliku classes.dex
, a inny kod jest umieszczany w osobnych plikach DEX. Przyspiesza to uruchamianie aplikacji, bo zmniejsza liczbę błędów strony. Więcej informacji o tym, jak profile uruchamiania i optymalizacje układu DEX mogą skrócić czas uruchamiania aplikacji, znajdziesz w artykule Profile uruchamiania i optymalizacje układu DEX.
Rozpocznij
Aby rozpocząć optymalizację wydajności w istniejącej aplikacji, przeczytaj artykuł Tworzenie profili podstawowych.
Minimalne zalecane wersje stabilne
Łańcuch zależności udostępnia stabilne i rozwojowe wersje wersji. Aby wygenerować i zainstalować profil podstawowy, użyj podanych niżej obsługiwanych wersji wtyczki Androida do obsługi Gradle lub nowszej, biblioteki Macrobenchmark i instalatora profilu. Zależności te są wymagane w różnych momentach i współdziałają jako łańcuch narzędzi zapewniający optymalny profil podstawowy.
- Wtyczka Androida do obsługi Gradle:
com.android.tools.build:8.0.0
- Biblioteka makroporównawczych:
androidx.benchmark:benchmark-macro-junit4:1.2.4
- Instalator profilu:
androidx.profileinstaller:profileinstaller:1.3.1
Do tworzenia profili bazowych i zarządzania nimi zalecamy korzystanie z najnowszej wersji AGP. Oto główne funkcje dostępne w różnych wersjach pakietu AGP:
Wersja AGP | Funkcje |
---|---|
8.4 | Lokalne instalacje aplikacji kompilacji, których nie można debugować, za pomocą narzędzia wiersza poleceń opakowań Gradle lub instalowania profili bazowych w Android Studio, dzięki czemu wydajność wersji lokalnej będzie bardziej zgodna z wersją produkcyjną. Ta aktualizacja nie ma wpływu na wydajność produkcyjną profili bazowych. |
8.3 |
|
8.2 |
|
z Androidem 8.0 | Minimalna zalecana wersja: użyj wtyczki Gradle profilu podstawowego do generowania profili bazowych 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 kilku zdarzeń nawigacji i przewijania za pomocą 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()
}
}
}
W pełnym kontekście i szczegółach znajdziesz ten kod w przykładach 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 lub przewijanie. Możesz też zbierać informacje o całych przepływach, takich jak rejestracja, logowanie czy płatność. Każda ścieżka użytkownika, którą uznasz za kluczową, może przynieść korzyści dzięki profilom bazowym dzięki poprawie wydajności środowiska wykonawczego.
Jeśli testujesz różne podejścia do poprawy skuteczności, rozważ dodanie profili bazowych dla obu grup eksperymentu. Ułatwi Ci to interpretację wyników, ponieważ zapewni to, że wszyscy użytkownicy regularnie korzystają z skompilowanego kodu.
Biblioteki mogą tworzyć własne profile bazowe i wysyłać im wersje, aby zwiększyć wydajność aplikacji. Zapoznaj się na przykład z sekcją Użyj profilu podstawowego w wydajności Jetpack Compose.
Jak działają profile podstawowe
Tworząc aplikację lub bibliotekę, zastanów się nad zdefiniowaniem profili podstawowych, aby uwzględnić typowe interakcje użytkowników, gdy czas renderowania lub opóźnienia są ważne. Działa to w następujący sposób:
Zrozumiałe dla człowieka reguły profilu są generowane dla aplikacji i kompilowane w postać binarną. 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.Google Play przetwarza profil i wysyła go bezpośrednio do użytkowników wraz z plikiem APK. Podczas instalacji ART wykonuje kompilację AOT metod w profilu, dzięki czemu działają one szybciej. Jeśli profil zawiera metody używane podczas uruchamiania aplikacji lub renderowania ramek, czas uruchamiania może być krótszy i mniej zacinane.
Ten proces współdziała z agregacją profili Cloud, aby dostosowywać wydajność na podstawie rzeczywistego wykorzystania aplikacji w danym okresie.
Profile w chmurze
Profile w chmurze stanowią dodatkową formę PGO – agregowane przez Sklep Google Play i rozpowszechniane w celu kompilacji czasu instalacji – w połączeniu z profilami podstawowymi.
Chociaż profile Cloud bazują na rzeczywistych interakcjach użytkowników z aplikacją, ich dostępność może potrwać od kilku godzin do kilku dni po jej rozpowszechnieniu. Dopóki profile nie zostaną w pełni rozproszone, wydajność aplikacji nie będzie optymalna w przypadku użytkowników nowych lub zaktualizowanych aplikacji. Ponadto CloudProfile obsługują tylko urządzenia z Androidem 9 (poziom interfejsu API 28) lub wyższym i dobrze skalują się tylko w przypadku aplikacji, które mają odpowiednio dużą bazę użytkowników.
Działanie kompilacji w różnych wersjach Androida
Wersje platformy Androida korzystają z innych metod kompilacji aplikacji, z których każda wiąże się z odpowiednim spadkiem wydajności. Profile podstawowe usprawniają poprzednie metody kompilacji, ponieważ zapewniają profil dla wszystkich instalacji.
Wersja Androida | Metoda kompilacji | Optymalizacja |
---|---|---|
od 5 do 6 (poziom API 21–23) | Pełna data AOT | Podczas instalacji cała aplikacja jest optymalizowana, co przekłada się na długi czas oczekiwania w aplikacji, większe wykorzystanie pamięci RAM i miejsca na dysku oraz dłuższe wczytywanie kodu z dysku, co potencjalnie może wydłużyć czas uruchamiania „na zimno”. |
od 7 do 8.1 (poziom API od 24 do 27) | Częściowy AOT (profil podstawowy) | Profile bazowe są instalowane przez androidx.profileinstaller przy pierwszym uruchomieniu, gdy moduł aplikacji określa tę zależność. ART może jeszcze bardziej to poprawić, dodając
dodatkowe reguły profilu
podczas używania aplikacji
i kompilować je, gdy urządzenie jest bezczynne. Optymalizuje to miejsce na dysku i czas wczytywania kodu z dysku, skracając w ten sposób czas oczekiwania aplikacji. |
9 (poziom API 28) i wyższy | Częściowy AOT (wartość podstawowa + profil Cloud) | Podczas instalowania aplikacji Google Play korzysta z profili podstawowych, aby optymalizować plik APK i profile Cloud (jeśli są dostępne). Po instalacji profile ART są przesyłane do Play, agregowane, a następnie przekazywane jako profile Cloud innym użytkownikom podczas instalowania lub aktualizowania aplikacji. |
Znane problemy
Poniżej znajdziesz możliwe problemy i rozwiązania oraz problemy, których obecnie pracujemy nad sposobami obejścia problemu:
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 #285187547).
Aby skutecznie udostępniać profile bazowe bibliotek, użyj wtyczki Gradle profilu podstawowego w wersji 1.2.3 lub AGP w wersji 8.3 co najmniej (numer zgłoszenia: 313992099).
Jeśli wygenerujesz profile podstawowe za pomocą polecenia
./gradlew app:generateBaselineProfile
, testy porównawcze w module testowym również zostaną uruchomione, a wyniki zostaną odrzucone. W takim przypadku możesz wygenerować tylko profile podstawowe, uruchamiając polecenie-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
. Naprawiliśmy ten problem w AGP 8.2.Polecenie do generowania profili podstawowych dla wszystkich typów kompilacji –
./gradlew app:generateBaselineProfile
– generuje tylko profile podstawowe dla typu kompilacji wersji. Naprawiliśmy ten problem w AGP 8.1.Kanały dystrybucji aplikacji spoza Sklepu Google Play mogą nie obsługiwać używania profili podstawowych podczas instalacji. Użytkownicy aplikacji instalowanych za pomocą tych kanałów nie dostrzegają korzyści do czasu uruchomienia dexopt. Działa to zwykle z dnia na dzień.
Wewnętrzne udostępnianie aplikacji w Sklepie Play nie obsługuje profili podstawowych, ale ścieżka testu wewnętrznego już tak.
W przypadku niektórych urządzeń, takich jak urządzenia Huawei, optymalizacja baterii może zakłócać instalację profilu. Aby mieć pewność, że profile będą instalowane prawidłowo, wyłącz wszelkie optymalizacje baterii w testach porównawczych.
Dodatkowe materiały
Polecane dla Ciebie
- Uwaga: tekst linku jest wyświetlany, gdy JavaScript jest wyłączony
- Tworzenie profili podstawowych {:#using-profile-rules}
- Tworzenie i pomiar profili bazowych bez użycia Macroporównanie
- Optymalizacje układu DEX i profile uruchamiania