Profile podstawowe zwiększają szybkość wykonywania kodu nawet o 30% dzięki unikaniu kroków kompilacji interpretera i kompilacji JIT w przypadku typowych ścieżek użytkownika. Profile bazowe pozwalają wybrać ścieżki użytkowników, które chcesz zoptymalizować. Mogą one pomóc w szybszym uruchamianiu aplikacji, zmniejszeniu liczby zacięć i innych problemów, co z kolei może poprawić wskaźniki biznesowe, takie jak utrzymanie użytkowników i oceny. Więcej informacji o profilach podstawowych
Zespół Kalendarza Google wdrożył profile bazowe i zaobserwował skrócenie czasu uruchamiania aplikacji o około 20% oraz zmniejszenie liczby powolnych lub zamrożonych klatek o około 50%. Poniżej znajdziesz opis ich działań od początku do końca, które pozwoliły im osiągnąć te wyniki – od powodów, dla których zdecydowali się użyć profili bazowych, po sposób pomiaru wpływu.
Profile w Google Cloud a profile podstawowe
Zespół Kalendarza Androida używał już profili w chmurze, które są inną metodą optymalizacji opartej na profilach (PGO) opartą na rzeczywistych interakcjach użytkowników z aplikacją. Oto porównanie profili w chmurze i profili podstawowych:
| Typ profilu | Skonfiguruj | Obejmuje ścieżki użytkowników | Najlepiej sprawdza się, gdy baza użytkowników jest | Wpływ zrealizowany | Obsługiwane wersje Androida |
|---|---|---|---|---|---|
Profile w Google Cloud |
Domyślnie włączone |
Wybierane automatycznie na podstawie danych o rzeczywistych użytkownikach |
Duży |
W ciągu kilku dni |
Android 9 (poziom 28 interfejsu API) lub nowszy |
Profile podstawowe |
Skonfigurowane przez Ciebie |
Wybrane przez Ciebie |
Wszystkie rozmiary |
Natychmiast |
Android 7 (poziom 24 interfejsu API) lub nowszy |
Jednym z głównych powodów, dla których zespół Kalendarza Androida zdecydował się dodać profile podstawowe do swojego kodu, było przejście na szybszy, cotygodniowy cykl wydawniczy. Profile w Cloud zapewniają znaczny wzrost skuteczności, ale osiągają szczytowy wpływ dopiero po 1–2 dniach od uruchomienia aplikacji, ponieważ opierają się na agregowaniu danych użytkowników z rzeczywistego świata. Uzupełnienie profili w chmurze profilami podstawowymi daje użytkownikom więcej czasu na korzystanie z ulepszeń wydajności przed wprowadzeniem kolejnej wersji aplikacji.
Dla zespołu Kalendarza na Androida ważne było też, aby móc wybierać, które kluczowe ścieżki użytkownika mają być uwzględnione w profilu. Można to zrobić za pomocą profili podstawowych.
Aby uzyskać najlepsze wyniki, zalecamy używanie profili podstawowych oprócz profili w chmurze, które są domyślnie włączone.
Obejmuje ścieżki użytkowników
Zespół Kalendarza Androida zdecydował się uwzględnić w profilach podstawowych 2 CUJ:
- Otwieranie aplikacji w widoku harmonogramu: początkowo jest to widok domyślny, dlatego warto go zoptymalizować pod kątem użytkowników, którzy korzystają z aplikacji po raz pierwszy lub nie zmieniają ustawień domyślnych.
- Otwieranie aplikacji w widoku miesiąca: wybrany widok dla wielu użytkowników na podstawie danych użytkowników. Aby śledzić, jak użytkownicy korzystają z aplikacji, możesz używać narzędzi takich jak Firebase.
Zwykle należy dodawać CUJ, które są korzystne dla firmy (w odpowiednich przypadkach), oraz CUJ, które występują najczęściej. Więcej informacji o wybieraniu CUJ do optymalizacji znajdziesz w sekcji Co uwzględnić.
Implementacja
Zespół Kalendarza Androida używa wewnętrznej otoczki biblioteki Jetpack Macrobenchmark do generowania profili bazowych, aby ułatwić integrację z narzędziami wewnętrznymi i ogólną skalowalność.
Oto konfiguracja testu Macrobenchmark dotyczącego otwierania aplikacji w widoku harmonogramu:
@Test
fun generateProfile() =
baselineProfileRule.collect(PACKAGE_NAME, includeInStartupProfile = true) {
uiAutomator {
startApp(packageName = PACKAGE_NAME)
// Verify pre-existing recurring events and tasks are shown.
// onElement waits for the element by default
onElement { textAsString() == "Recurring event" }
onElement { textAsString() == "Recurring task" }
// Open drawer and verify selected view.
onElement { contentDescriptionAsString() == "Show Calendar List and Settings drawer" }.click()
onElement { contentDescriptionAsString() == "Schedule view, Selected" }
}
}
Zastąp te elementy:
- PACKAGE_NAME: nazwa pakietu aplikacji, dla której chcesz wygenerować profile podstawowe.
Mierzenie wpływu za pomocą kontrolowanych wersji
Profile bazowe są ściśle powiązane z plikiem APK, z którym są dostarczane, i są włączane przed uruchomieniem aplikacji, więc nie można przeprowadzić standardowego eksperymentu A/B, aby poznać ich wpływ. Zespół Kalendarza Androida był jednak w stanie dokładnie zmierzyć wpływ zmian za pomocą kontrolowanych wydań, w których nowa wersja aplikacji jest udostępniana tylko podzbiorowi użytkowników, a następnie porównywana z użytkownikami, którzy korzystają z wersji podobnej do poprzedniej.
Dzięki profilom podstawowym odnotowali natychmiastową, znaczącą poprawę w wielu obszarach: Te statystyki są agregowane na wielu urządzeniach i wśród wszystkich użytkowników. Największe korzyści odniosą użytkownicy, którzy zaczynają od widoku harmonogramu i widoku miesiąca, ale inni użytkownicy również skorzystają dzięki optymalizacji wspólnych procesów, takich jak wczytywanie danych kalendarza z bazy danych.
- Mediana czasu uruchamiania aplikacji interaktywnej (najczęstszy scenariusz) zmniejszyła się z 775 ms do 644 ms (o 17%).
- Mediana czasu oczekiwania podczas uruchomienia „na zimno” zmniejszyła się z 1058 ms do 901 ms (o 15%).
- Mediana czasu oczekiwania na uruchomienie częściowo z pamięci zmniejszyła się z 453 ms do 378 ms (o 17%).
- Mediana liczby klatek z zacięciami spadła o 42–60% w widokach harmonogramu i miesiąca.
Pamiętaj, że jeśli używasz profili w chmurze w połączeniu z profilami podstawowymi, w ciągu pierwszego tygodnia możesz zauważyć niewielki spadek skuteczności, ponieważ profile w chmurze są generowane. Nadal jednak powinieneś zauważyć znaczny wzrost wydajności dzięki profilom bazowym w połączeniu z innymi optymalizacjami.
Więcej informacji o narzędziach i funkcjach znajdziesz w tych materiałach:
- Informacje o profilach podstawowych
- Testowanie profili podstawowych za pomocą biblioteki Macrobenchmark