Profile podstawowe zwiększają szybkość wykonywania kodu o około 30% od pierwszego uruchomienia, ponieważ unikają etapów 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 Ahead-of-Time (AOT), co zwiększa wydajność dla każdego nowego użytkownika i przy każdej aktualizacji aplikacji. Ta optymalizacja kierowana profilem (PGO) umożliwia aplikacjom optymalizację uruchamiania, zmniejszenie zacinania się interakcji i poprawę ogólnej wydajności działania 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 dane biznesowe, znajdziesz w historiach firm Josh, Lyft, TikTok i Zomato.
Zalety profili podstawowych
Profile Baseline umożliwiają wstępną kompilację kodu w przypadku kluczowych interakcji użytkownika, takich jak uruchamianie aplikacji, przechodzenie między ekranami czy przewijanie treści, dzięki czemu działają one płynniej od pierwszego uruchomienia. Dzięki zwiększeniu szybkości i responsywności aplikacji profile podstawowe mogą przyczynić się do wzrostu liczby aktywnych użytkowników dziennie i średniego współczynnika powracających użytkowników.
Profile podstawowe pomagają w optymalizacji nie tylko uruchamiania aplikacji, ale też typowych interakcji użytkownika, co poprawia działanie aplikacji od pierwszego uruchomienia. Kompilacja AOT z wykorzystaniem wskazówek nie zależy od urządzeń użytkowników i można ją wykonać raz na wersję na komputerze używanym do programowania, a nie na urządzeniu mobilnym. Dzięki udostępnianiu wersji z profilem Baseline optymalizacje aplikacji są dostępne znacznie szybciej niż w przypadku korzystania wyłącznie z profili Cloud.
Jeśli nie używasz profilu Baseline, 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 bezczynne. Po zainstalowaniu lub zaktualizowaniu aplikacji użytkownicy mogą mieć gorsze 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 startowe
Profile uruchamiania są podobne do profili Baseline, ale są używane w czasie kompilacji do optymalizacji układu DEX pod kątem szybszego uruchamiania, a nie do optymalizacji na urządzeniu. Więcej informacji o różnicach między profilami startowymi a profilami podstawowymi znajdziesz w artykule Porównanie profili podstawowych i startowych. Więcej informacji o optymalizacji układu DEX znajdziesz w artykule Optymalizacje układu DEX i profile uruchamiania.
Rozpocznij
Aby zacząć optymalizować wydajność istniejącej aplikacji, zapoznaj się z artykułem Tworzenie profili podstawowych.
Generowanie profilu a kompilacje do publikacji
Ważne jest, aby zrozumieć różnicę w konfiguracjach kompilacji wymaganych podczas generowania plików profilu Baseline i profilu startowego (np. baseline-prof.txt i startup-prof.txt) w porównaniu z tworzeniem ostatecznej wersji pakietu APK, która korzysta z tych profili.
Podczas generowania plików profilu (np. benchmark):
Podczas przechwytywania profilu Baseline za pomocą testu aplikacja nie może być zaciemniona.
Aby mieć pewność, że wygenerowane reguły profilu dokładnie odpowiadają sygnaturom metod kodu, musisz wyłączyć zaciemnianie i optymalizację (R8) w przypadku wariantu kompilacji używanego do generowania profilu. Ten wariant musi się różnić od wariantu kompilacji do publikacji, który ma włączone zaciemnianie i optymalizację. Możesz to zrobić, ustawiając isMinifyEnabled = false dla wariantu kompilacji generowania profilu. Jeśli nie używasz wtyczki Baseline Profile do Gradle, upewnij się, że zastosowano -dontobfuscate i -dontoptimize. Wtyczka Baseline Profile do Gradle automatycznie obsługuje tę konfigurację.
Aby sprawdzić, czy aplikacja nie została zaciemniona podczas generowania profilu, otwórz wygenerowany plik profilu tekstowego (np. baseline-prof.txt) i upewnij się, że nazwy klas i metod nie są zaciemnione.
Podczas tworzenia ostatecznej wersji pliku APK:
Podczas tworzenia aplikacji w wersji produkcyjnej należy ją zaciemnić. Kompilacja do publikacji musi mieć isMinifyEnabled = true, aby można było korzystać z zaciemniania kodu, minifikacji i optymalizacji. R8 automatycznie przepisuje reguły z niezaszyfrowanych plików profilu, aby pasowały do zaszyfrowanego i zoptymalizowanego kodu w wersji APK. Kompilacja wykorzystuje niezaszyfrowany plik tekstowy, prawidłowo przekształcając reguły.
Jeśli chcesz, aby optymalizacja układu DEX (oparta na profilach uruchamiania) działała, opublikowana aplikacja musi być zaciemniona i używać R8 ze wszystkimi włączonymi optymalizacjami.
Zaawansowane przepływy pracy (bez Gradle):
Jeśli do generowania profili używasz zaawansowanego przepływu pracy bez Gradle (np. Bazel, Buck lub niestandardowych potoków automatyzacji CI), musisz przestrzegać tych samych zasad. Podczas przechwytywania profilu aplikacja nie może być zaciemniona ani zoptymalizowana. Jednak podczas tworzenia aplikacji w wersji produkcyjnej musisz ją zaciemnić. R8 przetwarza plik reguł tekstu niezaszyfrowanego i prawidłowo przekształca reguły, aby zastosować je do zaszyfrowanej aplikacji w wersji produkcyjnej.
Zalecane minimalne wersje stabilne
Łańcuch zależności zawiera stabilne i rozwojowe wersje do publikacji. Aby wygenerować i zainstalować profil podstawowy, użyj tych obsługiwanych wersji (lub nowszych) wtyczki Androida do obsługi Gradle, biblioteki Macrobenchmark i instalatora profilu. Te zależności są wymagane w różnych momentach i współpracują ze sobą jako łańcuch narzędzi, który umożliwia optymalne działanie profilu podstawowego.
- Wtyczka Androida do obsługi Gradle:
com.android.tools.build:8.0.0 - Biblioteka Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.5.0 - Instalator profilu:
androidx.profileinstaller:profileinstaller:1.4.1
Zalecamy używanie najnowszej wersji AGP do tworzenia profili Baseline i zarządzania nimi. Oto najważniejsze funkcje dostępne w różnych wersjach AGP:
| Wersja AGP | Funkcje |
|---|---|
| 9.1 |
Pełna obsługa katalogu zbioru źródeł (moduły biblioteki): oprócz katalogów uwzględniających warianty możesz zadeklarować wiele plików źródłowych profilu Baseline o dowolnej nazwie, np. src/free/generated/baselineProfiles/baseline-prof1.txt, zarówno w przypadku modułów biblioteki, jak i modułów aplikacji.
|
| 8.4 | Lokalne instalacje aplikacji w kompilacjach bez możliwości debugowania za pomocą narzędzia wiersza poleceń Gradle wrapper lub Android Studio instalują profile Baseline, dzięki czemu wydajność lokalnej kompilacji do publikacji jest bardziej zbliżona do wersji produkcyjnej. Ta aktualizacja nie wpływa na wydajność profili podstawowych w środowisku produkcyjnym. |
| 8.3 |
|
| 8.2 |
|
| z Androidem 8.0 | Minimalna zalecana wersja: użyj wtyczki Baseline Profile Gradle, aby wygenerować profile podstawowe za pomocą jednego zadania Gradle.
|
| 7.4 |
Najwcześniejsza obsługiwana wersja: aplikacje mogą korzystać z profili Baseline z bibliotek i udostępniać własny profil Baseline w pliku src/main/baseline-prof.txt.
|
Ustawienia źródła profilu uwzględniającego warianty
Jeśli używasz 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 umieścić reguły profilu Baseline w dedykowanym katalogu zbioru źródeł, co pozwala wyjść poza ograniczenia pojedynczej, stałej ścieżki (np. src/main/baseline-prof.txt) i umożliwia korzystanie z wielu plików.
Ułatwia to obsługę wariantów, umożliwiając definiowanie różnych profili Baseline dostosowanych do konkretnych wersji i typów kompilacji (np. przy użyciu katalogów takich jak src/variant/baselineProfiles/). Dzięki temu reguły optymalizacji wydajności są precyzyjnie stosowane do 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 oraz kilka zdarzeń nawigacji i przewijania przy użyciu 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 automatyzowania ścieżek użytkownika znajdziesz w artykule Pisanie testów automatycznych za pomocą UI Automator.
Ten kod możesz zobaczyć w pełnym kontekście i bardziej szczegółowo w naszych przykładach dotyczących wydajności na GitHubie.
Co uwzględnić?
Podczas korzystania z profili Baseline w aplikacji możesz uwzględnić kod uruchamiania aplikacji i typowe interakcje użytkownika, takie jak nawigacja między ekranami lub przewijanie. Możesz też zbierać całe procesy, takie jak rejestracja, logowanie czy płatność. Profile podstawowe mogą poprawić wydajność wszystkich ścieżek użytkownika, które uznasz za kluczowe.
Jeśli eksperymentujesz z różnymi podejściami, aby poprawić wydajność, rozważ uwzględnienie profili podstawowych w obu grupach eksperymentalnych. Dzięki temu wyniki będą łatwiejsze do interpretacji, ponieważ wszyscy użytkownicy będą konsekwentnie uruchamiać skompilowany kod.
Biblioteki mogą udostępniać własne profile podstawowe i dołączać je do wersji, aby poprawić wydajność aplikacji. Zobacz na przykład sekcję Używanie profilu podstawowego w Jetpack Compose.
Jak działają profile podstawowe
Podczas tworzenia aplikacji lub biblioteki warto zdefiniować profile Baseline, aby uwzględnić typowe interakcje użytkowników, w przypadku których czas renderowania lub opóźnienie są ważne. Jak działają:
Dla aplikacji są generowane reguły profilu zrozumiałe dla człowieka, które są kompilowane do postaci binarnej w aplikacji. Znajdziesz je 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 wykonuje kompilację AOT metod w profilu, co przyspiesza ich wykonywanie. Jeśli profil zawiera metody używane podczas uruchamiania aplikacji lub renderowania klatek, użytkownik może zauważyć szybsze uruchamianie i mniejsze zacinanie się.
Ten proces współpracuje z agregacją profili w chmurze, aby dostosowywać wydajność na podstawie rzeczywistego korzystania z aplikacji w czasie.
Porównanie profili podstawowych i profili uruchamiania
Do definiowania i tworzenia plików profilu używasz wtyczki Baseline Profile Gradle.
Wtyczka ta podłącza się do procesu 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 wykorzystać do kompilacji na urządzeniu, pod warunkiem że jest mniejszy niż 1,5 MB.
Te pliki profilu mają zwykle nazwy startup-prof.txt i baseline-prof.txt. Chociaż ich zawartość może czasami wydawać się podobna, 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 Baseline 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 startowym. Ten plik zawiera wszystkie reguły wymagane do optymalizacji uruchamiania aplikacji (wygenerowane przez zadanie Gradle baselineProfile) oraz dodatkowe profile dla innych głównych ścieżek użytkownika. Możesz na przykład przewijać
i poruszać się po różnych ekranach.
Te dodatkowe reguły, które nie są regułami uruchamiania, są generowane niezależnie od wartości pola konfiguracji includeInStartupProfile.
Profil startupu
Plik profilu uruchamiania zawiera reguły zoptymalizowane pod kątem ścieżki uruchamiania aplikacji. Podczas kompilacji D8 konwertuje kod bajtowy Javy na format DEX.
R8 używa tego pliku do wpływania na układ plików DEX, dzięki czemu krytyczny kod startowy jest umieszczany w głównym pliku DEX, co przyspiesza jego wykonywanie. Zasadniczo wartość includeInStartupProfile należy ustawić na true tylko w przypadku scenariuszy testowych, które są niezbędne do początkowego wyświetlenia aplikacji. Więcej informacji znajdziesz w artykule o tworzeniu profili uruchamiania.
Profile w Google Cloud
Profile Cloud stanowią dodatkową formę optymalizacji sterowanej profilowaniem (PGO) – są agregowane przez Sklep Google Play i rozpowszechniane na potrzeby kompilacji w czasie instalacji – wraz z profilami Baseline.
Chociaż profile Cloud są tworzone na podstawie rzeczywistych interakcji użytkowników z aplikacją, ich rozpowszechnianie po aktualizacji zajmuje od kilku godzin do kilku dni, co ogranicza ich dostępność. Dopóki profile nie zostaną w pełni rozpowszechnione, wydajność aplikacji jest nieoptymalna dla użytkowników nowych lub zaktualizowanych aplikacji. Ponadto profile Cloud obsługują tylko urządzenia z Androidem 9 (poziom interfejsu API 28) lub nowszym i skalują się dobrze tylko w przypadku aplikacji, które mają 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 pod względem wydajności. Profile podstawowe ulepszają poprzednie metody kompilacji, udostępniając profil dla wszystkich instalacji.
| Wersja Androida | Metoda kompilacji | Podejście do optymalizacji |
|---|---|---|
| 5–6 (poziom API 21–23) | Pełna kompilacja AOT | Cała aplikacja jest optymalizowana podczas instalacji, co powoduje długi czas oczekiwania na możliwość korzystania z niej, zwiększone wykorzystanie pamięci RAM i miejsca na dysku oraz dłuższy czas wczytywania kodu z dysku, co może wydłużyć czas uruchamiania „na zimno”. |
| 7–8.1 (interfejs API na poziomie 24–27) | Częściowa kompilacja AOT (profil podstawowy) | Profile Baseline są instalowane przez androidx.profileinstaller przy pierwszym uruchomieniu, gdy moduł aplikacji definiuje tę zależność. ART może jeszcze bardziej
poprawić wydajność,
dodając dodatkowe reguły
profilu podczas korzystania
z aplikacji i kompilując je,
gdy urządzenie jest bezczynne. Pozwala to zoptymalizować 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 Baseline podczas instalacji aplikacji, aby zoptymalizować pliki APK i profile Cloud, jeśli są dostępne. Po instalacji profile ART są przesyłane do Google Play, agregowane, a następnie udostępniane jako profile w chmurze innym użytkownikom, gdy instalują lub aktualizują aplikację. |
Znane problemy
Poniżej znajdziesz możliwe problemy i rozwiązania lub problemy, nad których rozwiązaniem obecnie pracujemy:
Generowanie profilu Baseline może się nie powieść z powodu ustawień uprawnień na niektórych urządzeniach, w tym OnePlus. Aby obejść ten problem, wyłącz opcję Wyłącz monitorowanie uprawnień w ustawieniach Opcje programisty.
Aby skutecznie udostępniać profile Baseline dla bibliotek, używaj co najmniej wtyczki Baseline Profile Gradle w wersji 1.2.3 lub AGP w wersji 8.3 (problem nr 313992099).
Jeśli wygenerujesz profile Baseline za pomocą polecenia
./gradlew app:generateBaselineProfile, zostaną też uruchomione testy porównawcze w module testowym, a wyniki zostaną odrzucone. Jeśli tak się stanie, możesz wygenerować tylko profile Baseline, uruchamiając polecenie z-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Ten problem został rozwiązany w AGP 8.2.Polecenie generowania profili podstawowych dla wszystkich typów kompilacji (
./gradlew app:generateBaselineProfile) generuje profile podstawowe tylko dla typu kompilacji do publikacji. Ten problem został rozwiązany we wtyczce Androida do obsługi Gradle w wersji 8.1.Kanały rozpowszechniania aplikacji spoza Sklepu Google Play mogą nie obsługiwać korzystania z 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 Baseline, ale ścieżka testu wewnętrznego już tak.
Optymalizacja zużycia baterii na niektórych urządzeniach, np. Huawei, może zakłócać instalację profilu. Aby mieć pewność, że profile są instalowane skutecznie, wyłącz optymalizację 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