Instrukcje

Przewodnik po poziomach w programie Performance Journey

Czas czytania: 8 minut
Wyświetl profil Alice Yuan
Alice Yuan Inżynier ds. relacji z programistami na Androida

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 podstawowymi i profilami uruchamiania, możesz się zastanawiać, od czego zacząć poprawę wydajności. 

Przygotowaliśmy przewodnik po etapach poprawy wydajności, który pomoże Ci w rozwoju zespołu zajmującego się tworzeniem 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ół, który zajmuje 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.

 
Wybierz poziom, 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, które dostarczają informacji o 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 obejmują częstotliwość awarii widoczną dla użytkowników, częstotliwość błędów ANR, nadmierne wykorzystanie baterii i nowo wprowadzony 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ć ślady 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

Użyj panelu awarii Android Vitals, aby dokładniej debugować awarie i wyświetlać przykładowe zrzuty stosu występujące w aplikacji. 

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 urządzeniach z 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 ekranu, które nie są zwolnione z tego obowiązku i są uzyskiwane, gdy ekran jest wyłączony, a aplikacja działa w tle lub uruchamia usługę 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. Wykonaj działania związane z wynikiem 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 ustandaryzowana platforma do 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 Wynik statyczny na stronie tablicy wyników i wykonaj te czynności:

  1. Sprawdź wersję wtyczki Androida do obsługi Gradle (AGP).
  2. Zastosuj stopniowo R8 do minimalizacji lub, co jest lepszym rozwiązaniem, użyj R8 w trybie pełnym, aby zminimalizować i zoptymalizować 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 APK.
  5. Uaktualnianie do najnowszej wersji Jetpack Compose

Krok 2. Przeprowadź ocenę dynamiczną

Po zastosowaniu statycznych łatwych do osiągnięcia ulepszeń użyj dynamicznej oceny, aby sprawdzić, czy na prawdziwym urządzeniu nastąpiły zmiany na lepsze. 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 za pomocą urządzenia fizycznego. Rozważ użycie urządzenia z niższej półki, aby wyolbrzymić problemy z wydajnością i ułatwić ich wykrycie.
  2. Mierz czas 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 kroków 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 (takich jak czas uruchamiania czy pominięte klatki) 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

Makrobenchmark udostępnia kilka podstawowych danych od razu po wyjęciu z pudełka. StartupTimingMetric umożliwia dokładne pomiary uruchamiania aplikacji. Ikona FrameTimingMetric pozwala sprawdzić wydajność renderowania aplikacji podczas testu.

Przygotowaliśmy szczegółowy przewodnik po korzystaniu z testów porównawczych i UiAutomator 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 debuggerów lub profilerów, które widzą tylko Twój proces, Perfetto rejestruje cały stan urządzenia – planowanie jądra, 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 filmy z instrukcjami debugowania wydajności za pomocą śladów systemowych, profilera Android Studio i narzędzia 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 Perfetto traceviewer.

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ęć (pominię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 dotyczy aplikacji, możesz zauważyć, że wątek główny działa przez długi czas i wykonuje intensywne parsowanie. Wskazuje to sytuacje, w których należy przenieść pracę do przetwarzania asynchronicznego.

Jeśli problem leży po stronie systemu, wątek główny 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 aplikacja wykonuje więcej pracy niż jest to konieczne podczas uruchamiania. 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 idealnie nadaje się do wykrywania niewidocznych przyczyn zużycia energii.

Na ścieżkach „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 użycia kilku interfejsów API systemu do rejestrowania danych w całym cyklu życia aplikacji – od uruchomienia po zamknięcie – oraz w określonych scenariuszach dużego obciążenia.

Korzystając z ApplicationStartInfo, ProfilingManager i ApplicationExitInfo, możesz utworzyć solidny system telemetrii, który będzie raportować, jak uruchamia się Twoja aplikacja, 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ść uruchamiania na podstawie danych produkcyjnych, aby dalej optymalizować to, co może być trudne do odtworzenia lokalnie. Na podstawie tych danych możesz przeprowadzać testy A/B, aby optymalizować proces uruchamiania.

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

Możesz leniwie wysyłać zapytania o te dane 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 naszą dokumentacją, aby dowiedzieć się, jak rejestrować profil, pobierać i analizować dane profilowania oraz używać poleceń debugowania.

ApplicationExitInfo: śledzenie przyczyn zamknięcia aplikacji

ApplicationExitInfo (interfejs API 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). Możesz też uzyskać szczegółowy ślad po usunięciu aplikacji, korzystając z interfejsu API getTraceInputStream.

Celem interfejsu API jest wykrywanie problemów ze stabilnością, które nie są zgłaszane przez standardowe narzędzia do raportowania awarii w języku Java (np. zamykanie aplikacji z powodu braku pamięci).

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

Następne kroki

Poprawa wydajności Androida to proces krok po kroku. Cieszymy się, że możemy Ci pomóc w zwiększaniu skuteczności dzięki tym narzędziom.

Jutro zapraszamy na 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ę pytań i odpowiedzi na żywo dotyczącą Androida. Zadaj teraz pytania, używając hashtagu #AskAndroid, a eksperci na nie odpowiedzą.

Autorzy:
Czytaj dalej