Instrukcje

Przewodnik po poziomach na drodze do sukcesu

Czas czytania: 9 minut
Alice Yuan
Inżynier ds. relacji z deweloperami

Przewodnik po poziomach skuteczności

Witamy w 4 dniu Tygodnia wyróżnień za skuteczność. Teraz, gdy znasz już niektóre z naszych najnowszych narzędzi i sprawdzonych metod, takich jak optymalizator R8 czy optymalizacja z użyciem profili z profilami bazowymiprofilami uruchamiania, możesz się zastanawiać, od czego zacząć poprawę wydajności. 

Przygotowaliśmy szczegółowy przewodnik po poziomach wydajności, który pomoże Ci w pracy z zespołem ds. tworzenia aplikacji mobilnych – niezależnie od tego, czy jesteś deweloperem pracującym nad aplikacją i chcesz zacząć dbać o jej wydajność, czy masz cały zespół zajmujący się poprawą wydajności aplikacji na Androida.

Przewodnik po poziomach skuteczności zawiera 5 poziomów. Zaczniemy od poziomu 1, który wprowadza narzędzia do pomiaru wydajności wymagające minimalnego nakładu pracy, a skończymy na poziomie 5, idealnym dla aplikacji, które mają zasoby do utrzymania niestandardowych ram wydajności.

 
Możesz przejść do poziomu, który najbardziej Ci odpowiada:

Poziom 1. Korzystanie z monitorowania pól w Konsoli Play

Najpierw zalecamy korzystanie z Android Vitals w Konsoli Play, aby wyświetlać automatycznie zbierane dane monitorowania w terenie. Dzięki temu możesz uzyskać statystyki dotyczące aplikacji przy minimalnym wysiłku.

Android Vitals to inicjatywa Google, która ma na celu automatyczne zbieranie i wyświetlanie tych danych z terenu.

Oto wyjaśnienie, jak dostarczamy te dane:

  1. Zbieranie danych:  gdy użytkownik wyrazi zgodę, jego urządzenie z Androidem automatycznie rejestruje kluczowe zdarzenia związane z wydajnością i stabilnością wszystkich aplikacji, w tym Twojej.
  2. Dane zbiorcze: Google Play zbiera i anonimizuje te dane od użytkowników Twojej aplikacji.
  3. Surface Insights: dane są prezentowane na panelu Android Vitals w Konsoli Google Play.

Panel Android Vitals śledzi wiele danych, ale niektóre z nich są oznaczone jako podstawowe wskaźniki. Są one najważniejsze, ponieważ mogą wpływać na widoczność i ranking aplikacji w Sklepie Google Play.

Podstawowe wskaźniki

PODSTAWOWE TECHNICZNE DANE DOTYCZĄCE JAKOŚCI W GOOGLE PLAY

Aby zmaksymalizować widoczność w Google Play, utrzymuj wartości tych danych poniżej progów niewłaściwego działania.

Częstotliwość awarii widocznych dla użytkownikówOdsetek aktywnych użytkowników dziennie, u których wystąpiła co najmniej 1 awaria, która prawdopodobnie została zauważona
Częstotliwość błędów ANR widocznych dla użytkownikówOdsetek aktywnych użytkowników dziennie, u których wystąpił co najmniej 1 błąd ANR, który prawdopodobnie został zauważony
Nadmierne wykorzystanie bateriiOdsetek sesji tarczy zegarka, podczas których wykorzystanie baterii przekroczyło 4,44% na godzinę.
Nowość: zbyt wiele częściowych blokad uśpieniaOdsetek sesji użytkowników, podczas których łączne użycie blokady uśpienia (z wyłączeniem wyjątków) przekracza 2 godziny.

Podstawowe wskaźniki to częstotliwość awarii widocznych dla użytkowników, częstotliwość błędów ANR, nadmierne wykorzystanie baterii i nowy wskaźnik nadmiernego czasu częściowych blokad uśpienia.

Częstotliwość błędów ANR widocznych dla użytkowników

Możesz użyć panelu ANR w Android Vitals, aby wyświetlić zrzuty stosu problemów występujących w terenie oraz uzyskać statystyki i rekomendacje dotyczące ich rozwiązywania. 

crashesAnrs.png

Możesz przejść do szczegółów konkretnego błędu ANR, aby zobaczyć ślad stosu oraz informacje o tym, co może być przyczyną problemu.

insights.png

Zapoznaj się też z naszymi wskazówkami dotyczącymi błędów ANR, które pomogą Ci zdiagnozować i rozwiązać typowe problemy, w przypadku których mogą wystąpić błędy ANR. 

Częstotliwość awarii widocznych dla użytkowników

Aby dokładniej debugować awarie i wyświetlać próbki zrzutów stosu występujących w aplikacji, użyj panelu awarii Android Vitals

W naszej dokumentacji znajdziesz też wskazówki dotyczące rozwiązywania problemów z konkretnymi awariami. Na przykład w przewodniku rozwiązywania problemów z usługami na pierwszym planie znajdziesz sposoby identyfikowania i naprawiania typowych sytuacji, w których dochodzi do awarii.

Nadmierne wykorzystanie baterii

Aby zmniejszyć liczbę sesji tarczy zegarka z nadmiernym wykorzystaniem baterii na Wear OS, zapoznaj się z przewodnikiem po Wear dotyczącym oszczędzania baterii

[nowość] Zbyt wiele częściowych blokad uśpienia

 

Niedawno ogłosiliśmy, że w przypadku aplikacji, które przekroczą próg nadmiernego czasu częściowych blokad uśpienia, od 1 marca 2026 r. mogą zostać podjęte dodatkowe działania.

W przypadku urządzeń mobilnych wskaźnik Android Vitals dotyczy blokad uśpienia, które nie są zwolnione z tego obowiązku i są uzyskiwane, gdy ekran jest wyłączony, a aplikacja działa w tle lub jako usługa (działająca) na pierwszym planie. Android Vitals uznaje użycie częściowej blokady uśpienia za nadmierne, jeśli blokady uśpienia są utrzymywane przez co najmniej 2 godziny w ciągu 24 godzin i ma to wpływ na ponad 5% sesji aplikacji (średnia z 28 dni).

Aby debugować i rozwiązywać problemy z nadmierną blokadą uśpienia, zapoznaj się z naszym technicznym postem na blogu.

Zapoznaj się z naszą dokumentacją Android Vitals i dalej doskonal swoje umiejętności korzystania z tej usługi.

Poziom 2. Postępuj zgodnie z działaniami dotyczącymi wyniku skuteczności aplikacji

Następnie użyj wyniku wydajności aplikacji, aby znaleźć działania o dużym potencjale, które pozwolą Ci zwiększyć wydajność aplikacji.

Wynik wydajności aplikacji na Androida to ustandaryzowany system pomiaru jakości technicznej aplikacji. Jest to wartość z zakresu od 0 do 100, gdzie mniejsza liczba oznacza większe możliwości poprawy.

Aby łatwo osiągnąć sukces, zacznij od statycznego wyniku skuteczności. Są to często zmiany konfiguracji lub aktualizacje narzędzi, które znacznie zwiększają wydajność.

Krok 1. Przeprowadź ocenę statyczną

Ocena statyczna obejmuje konfigurację projektu i wykorzystanie narzędzi. To często najszybsze sposoby na poprawę wydajności.

Przejdź do sekcji wyniku statycznego na stronie tablicy wyników i wykonaj te czynności:

  1. Sprawdź wersję wtyczki Androida do obsługi Gradle (AGP).
  2. Wprowadzaj stopniowo minimalizację R8 lub najlepiej używaj R8 w trybie pełnym, aby minimalizować i optymalizować kod aplikacji.
  3. Wprowadź profile podstawowe, które zwiększają szybkość wykonywania kodu od pierwszego uruchomienia, co poprawia wydajność każdej nowej instalacji i każdej aktualizacji aplikacji.
  4. Wprowadź profile startupów, aby ulepszyć układ Dex. Profile uruchamiania są używane przez system kompilacji do dalszej optymalizacji klas i metod, które zawierają, poprzez ulepszanie układu kodu w plikach DEX w pliku APK.
  5. Uaktualnianie do najnowszej wersji Jetpack Compose

Krok 2. Przeprowadź ocenę dynamiczną

Po zastosowaniu statycznych łatwych do uzyskania korzyści użyj dynamicznej oceny, aby sprawdzić ulepszenia na prawdziwym urządzeniu. Możesz to najpierw zrobić ręcznie za pomocą urządzenia fizycznego i stopera.

Przejdź do sekcji Dynamiczny wynik na stronie tablicy wyników i wykonaj te czynności:

  1. Skonfiguruj środowisko testowe na urządzeniu fizycznym. Rozważ użycie urządzenia z niższej półki, aby wyolbrzymić problemy z wydajnością i ułatwić ich wykrycie.
  2. Pomiar czasu uruchamiania z menu z aplikacjami. Uruchom aplikację „na zimno” za pomocą ikony w programie uruchamiającym i zmierz czas, po którym będzie można z niej korzystać.
  3. Mierz czas uruchamiania aplikacji z poziomu powiadomienia, aby skrócić go do kilku sekund.
  4. Mierz wydajność renderowania, przewijając główne ekrany i animacje.

Po wykonaniu tych czynności otrzymasz wynik w skali od 1 do 100 dla wyników statycznych i dynamicznych. Dzięki temu dowiesz się, jak działa Twoja aplikacja i na czym warto się skupić.

Poziom 3. Korzystanie z lokalnych platform testowania wydajności

Gdy zaczniesz oceniać dynamiczne wyniki, możesz uznać, że ręczne pomiary są zbyt żmudne. Rozważ zautomatyzowanie testów wydajności za pomocą platform testów wydajności, takich jak Macrobenchmark i UiAutomator.

Macrobenchmark 💚 UiAutomator

Macrobenchmark i UiAutomator to 2 narzędzia, które współpracują ze sobą: Macrobenchmark służy do pomiarów. Jest to stoper i licznik klatek działający poza aplikacją. Odpowiada za uruchamianie aplikacji, rejestrowanie danych (np. czasu uruchamiania lub pominiętych klatek) i zamykanie aplikacji. UiAutomator to robot-użytkownik. Biblioteka umożliwia pisanie kodu do interakcji z ekranem urządzenia. Może znaleźć ikonę, kliknąć przycisk,  przewinąć listę i wykonać inne czynności.

Jak napisać test

Podczas pisania testu kod UiAutomator umieszczasz w bloku Macrobenchmark.

  1. Określ test: użyj @MacrobenchmarkRule
  2. Rozpocznij pomiar: kliknij benchmarkRule.measureRepeated.
  3. Sterowanie interfejsem: w tym bloku użyj kodu UiAutomator, aby uruchomić aplikację, znaleźć elementy interfejsu i wejść z nimi w interakcję.

Oto przykładowy fragment kodu pokazujący, jak przetestować listę kompozycji pod kątem zacinania się podczas przewijania.

benchmarkRule.measureRepeated(

    // ...

    metrics = listOf(

        FrameTimingMetric(),

    ),

    startupMode = StartupMode.COLD,

    iterations = 10,

) {

    // 1. Launch the app's main activity

    startApp()

    // 2. Find the list using its resource ID and scroll down

    onElement { viewIdResourceName == "$packageName.my_list" }

        .fling(Direction.DOWN)

}

4. Sprawdź wyniki: każdy test dostarcza precyzyjnie zmierzonych informacji, które zapewniają najlepsze dane o działaniu aplikacji.

timeToInitialDisplayMs  min  1894.4,   median 2847.4,   max  3355.6


frameOverrunMs          P50 -3.2,  P90  6.2, P95  10.4, P99  119.5

Częste przypadki użycia

Biblioteka Macrobenchmark udostępnia kilka podstawowych danych. StartupTimingMetric umożliwia dokładne pomiary uruchamiania aplikacji. Ikona FrameTimingMetric umożliwia sprawdzenie wydajności renderowania aplikacji podczas testu.

Przygotowaliśmy szczegółowy i kompletny przewodnik po korzystaniu z testów porównawczychUiAutomator wraz z przykładowymi kodami, które pomogą Ci w dalszej nauce.

Poziom 4. Używaj narzędzi do analizy śladów, takich jak Perfetto 

Narzędzia do analizy śladów, takie jak Perfetto, są używane, gdy chcesz zobaczyć coś więcej niż tylko kod aplikacji. W przeciwieństwie do standardowych debugerów i programów profilujących, które widzą tylko Twój proces, Perfetto rejestruje cały stan urządzenia – planowanie jądra systemu operacyjnego, częstotliwość procesora, inne procesy i usługi systemowe – co daje pełny kontekst problemów z wydajnością.

Na naszej playliście YouTube dotyczącej debugowania wydajności znajdziesz instrukcje wideo dotyczące debugowania wydajności za pomocą śladów systemowych, profilera Android Studio i Perfetto.

Jak używać Perfetto do debugowania wydajności

Ogólny proces debugowania wydajności za pomocą narzędzi do analizy śladu polega na zarejestrowaniu, wczytaniu i przeanalizowaniu śladu. 

Krok 1. Nagraj ślad

Ślad systemowy możesz zarejestrować na kilka sposobów: 

Krok 2. Wczytaj ślad

Po uzyskaniu pliku śledzenia musisz go wczytać do narzędzia do analizy.

  1. Otwórz Chrome i przejdź na stronę ui.perfetto.dev.
  2. Przeciągnij i upuść plik .perfetto-trace (lub .pftrace) bezpośrednio w oknie przeglądarki.
  3. Interfejs przetworzy plik i wyświetli oś czasu.

Krok 3. Analiza śladu

Do badania problemów z wydajnością możesz używać interfejsu Perfetto lub profilera Androida Studio. Obejrzyj odcinek serii MAD Skills poświęcony wydajności, w którym inżynier ds. wydajności Carmen Jackson omawia narzędzie do śledzenia Perfetto.

Scenariusze sprawdzania śladów systemowych za pomocą Perfetto

Perfetto to zaawansowane narzędzie, które może dostarczać informacji o wszystkim, co działo się na urządzeniu z Androidem podczas rejestrowania śladu. Jest to szczególnie przydatne, gdy nie możesz zidentyfikować głównej przyczyny spowolnienia za pomocą standardowych logów lub podstawowych profilerów.

Debugowanie zacięć (usuniętych klatek)

Jeśli podczas przewijania aplikacja się zacina, Perfetto może dokładnie pokazać, dlaczego konkretna klatka nie została wyświetlona w terminie.

Jeśli problem jest związany z aplikacją, wątek główny może działać przez długi czas, wykonując intensywne parsowanie. Wskazuje to sytuacje, w których należy przenieść pracę do przetwarzania asynchronicznego.

Jeśli problem leży po stronie systemu, główny wątek może być gotowy do uruchomienia, ale harmonogram jądra procesora nadał priorytet innej usłudze systemowej, przez co aplikacja musi czekać (konkurencja o procesor). Wskazuje to sytuacje, w których może być konieczne zoptymalizowanie wykorzystania interfejsów API platformy.

Analizowanie powolnego uruchamiania aplikacji

Uruchamianie jest złożone i obejmuje inicjowanie systemu, rozwidlanie procesów i wczytywanie zasobów. Perfetto precyzyjnie wizualizuje tę oś czasu.

Możesz sprawdzić, czy czekasz na wywołania Binder (komunikacja międzyprocesowa). Jeśli onCreate długo czeka na odpowiedź z systemu PackageManager, Perfetto wyraźnie pokaże ten stan zablokowania. 

Możesz też sprawdzić, czy podczas uruchamiania aplikacja nie wykonuje więcej pracy niż jest to konieczne. Jeśli na przykład tworzysz i układasz więcej widoków, niż aplikacja musi wyświetlać, możesz zobaczyć te operacje w śladzie.

Sprawdzanie zużycia baterii i wykorzystania procesora

Perfetto widzi cały system, więc doskonale nadaje się do wykrywania niewidocznych źródeł zużycia energii.

W sekcji „Stan urządzenia” możesz sprawdzić, które procesy blokują uśpienie urządzenia. Więcej informacji znajdziesz w naszym poście na blogu o blokadach wybudzania. Użyj też Perfetto, aby sprawdzić, czy zadania w tle nie są wykonywane zbyt często lub czy niepotrzebnie nie wybudzają procesora.

Poziom 5. Tworzenie własnej platformy śledzenia skuteczności

Ostatni poziom jest przeznaczony dla aplikacji, których zespoły mają zasoby do utrzymywania struktury śledzenia skuteczności. 

Tworzenie niestandardowych ram śledzenia wydajności na Androidzie wymaga korzystania z kilku interfejsów API systemu, aby rejestrować dane w całym cyklu życia aplikacji – od uruchomienia do zamknięcia – oraz w określonych scenariuszach dużego obciążenia.

Korzystając z ApplicationStartInfo, ProfilingManagerApplicationExitInfo, możesz utworzyć niezawodny system telemetrii, który będzie raportować, jak uruchomiono aplikację, podawać szczegółowe informacje o jej działaniu i wyjaśniać, dlaczego została zamknięta.

ApplicationStartInfo: śledzenie sposobu uruchomienia aplikacji

Dostępny od Androida 15 (API na poziomie 35) interfejs ApplicationStartInfo udostępnia szczegółowe dane o uruchamianiu aplikacji w terenie. Dane obejmują informacje o tym, czy uruchomienie było zimne, ciepłe czy uruchamianiem z pamięci, oraz czas trwania poszczególnych faz uruchamiania. 

Pomaga to opracować podstawową wartość początkową za pomocą danych produkcyjnych, aby dalej optymalizować to, co może być trudne do odtworzenia lokalnie. Możesz używać tych danych do przeprowadzania testów A/B, aby optymalizować proces uruchamiania.

Celem jest dokładne rejestrowanie danych o uruchomieniu bez ręcznego instrumentowania każdej fazy inicjowania.

Możesz wysyłać zapytania do tych danych z opóźnieniem, jakiś czas po uruchomieniu aplikacji.

ProfilingManager: Capturing why it was slow

ProfilingManager (API 35) umożliwia aplikacji programowe wywoływanie śledzenia systemu na urządzeniach użytkowników. Jest to przydatne do wykrywania przejściowych problemów z wydajnością, których nie można odtworzyć lokalnie.

Chodzi o automatyczne rejestrowanie śladu, gdy określona, bardzo ważna ścieżka użytkownika działa wolno lub występują w niej problemy z wydajnością.

Możesz zarejestrować detektor, który będzie wywoływany po spełnieniu określonych warunków, lub wywołać go ręcznie, gdy wykryjesz problem z wydajnością, np. zacięcie, nadmierne zużycie pamięci lub szybkie zużycie baterii.

Zapoznaj się z dokumentacją na temat rejestrowania profilupobierania i analizowania danych profilowania oraz korzystania z poleceń debugowania.

ApplicationExitInfo: śledzenie przyczyn zamknięcia aplikacji

ApplicationExitInfo (interfejs API w wersji 30) informuje, dlaczego poprzedni proces został zakończony. Jest to kluczowe w przypadku znajdowania awarii natywnych, błędów ANR lub zamknięć systemu z powodu nadmiernego wykorzystania pamięci (OOM). Szczegółowy ślad po awarii możesz też uzyskać za pomocą interfejsu API getTraceInputStream.

Celem interfejsu API jest wykrywanie problemów ze stabilnością, które nie wywołują standardowych narzędzi do raportowania awarii w języku Java (np. sytuacji, w których system operacyjny zamyka aplikację z powodu braku pamięci).

Ten interfejs API należy wywołać przy  następnym uruchomieniu aplikacji.

Kolejne kroki

Poprawa wydajności Androida to proces krok po kroku. Nie możemy się doczekać, aż zaczniesz korzystać z tych narzędzi, aby zwiększyć skuteczność swoich działań.

Jutro odbędzie się sesja Ask Android

Zmniejszono rozmiar aplikacji za pomocą R8 i zoptymalizowano środowisko wykonawcze za pomocą optymalizacji opartej na profilu. i mierzyć skuteczność aplikacji.

Dołącz do nas jutro na sesję na żywo „Zapytaj o Androida”. Zadaj teraz pytania, używając hashtagu #AskAndroid, a eksperci na nie odpowiedzą.

Autor:

Czytaj dalej