Wydarzenia i programy

Używanie R8 do zmniejszania, optymalizowania i przyspieszania działania aplikacji

Czas czytania: 5 minut
Ben Weiss
Inżynier ds. relacji z deweloperami

Używanie R8 do zmniejszania, optymalizowania i przyspieszania działania aplikacji

Witamy w pierwszym dniu Tygodnia wyróżnień za skuteczność Androida.

Zaczynamy od jednej z najbardziej skutecznych zmian, które możesz wprowadzić, aby poprawić wydajność aplikacji, a która nie wymaga dużego nakładu pracy: włączenie optymalizatora R8 w trybie pełnym.

R8 jest prawdopodobnie znany jako narzędzie do zmniejszania rozmiaru aplikacji. Doskonale usuwa nieużywany kod i zasoby, zmniejszając rozmiar aplikacji. Ale jego prawdziwa moc, w której jest naprawdę g-R8, to optymalizacja.

Gdy włączysz tryb pełny i zezwolisz na optymalizacje, R8 przeprowadzi zaawansowane optymalizacje całego programu, przepisując kod w taki sposób, aby był zasadniczo bardziej wydajny. To nie jest tylko drobna zmiana.

Po przeczytaniu tego artykułu obejrzyj na YouTube wprowadzenie do optymalizatora R8 w ramach serii Performance Spotlight Week.

Jak R8 zwiększa wydajność aplikacji

obraz.png

Przyjrzyjmy się najważniejszym krokom, jakie wykonuje optymalizator R8, aby zwiększyć wydajność aplikacji.

Usuwanie nieużywanego kodu to najważniejszy krok w procesie zmniejszania rozmiaru aplikacji. Na tym etapie optymalizator R8 usuwa nieużywany kod z bibliotek, od których zależy aplikacja, a także martwy kod z własnej bazy kodu.

Wstawianie metod zastępuje wywołanie metody rzeczywistym kodem, co zwiększa wydajność w czasie działania.

Scalanie klas i inne strategie są stosowane w celu zmniejszenia rozmiaru kodu. Wszystkie piękne abstrakcje, takie jak interfejsy i hierarchie klas, nie mają w tym momencie znaczenia i prawdopodobnie zostaną usunięte.

Minifikacja kodu służy do zmiany nazw klas, pól i metod na krótsze, bez znaczenia. Zamiast MyDataModel możesz więc mieć zajęcia o nazwie a. To właśnie powoduje największe zamieszanie podczas odczytywania śladów stosu z aplikacji zoptymalizowanej za pomocą R8. (Pamiętaj, że ulepszyliśmy to w AGP 9.0).

Zmniejszanie zasobów dodatkowo zmniejsza rozmiar aplikacji przez usuwanie nieużywanych zasobów, takich jak pliki XML i elementy rysunkowe.

Dzięki zastosowaniu tych kroków optymalizator R8 skraca czas uruchamiania aplikacji, umożliwia płynniejsze renderowanie interfejsu z mniejszą liczbą powolnych i zamrożonych klatek oraz poprawia ogólne wykorzystanie zasobów na urządzeniu.

Studium przypadku: wzrost wydajności Reddita dzięki R8

Aby zobaczyć, jak R8 może zwiększyć wydajność, przyjrzyjmy się przykładowi z Reddit. Po włączeniu R8 w trybie pełnym aplikacja Reddit na Androida odnotowała znaczną poprawę wydajności w różnych obszarach.

obraz.png

Podpis: Jak R8 poprawił wydajność aplikacji Reddit

Zespół zaobserwował 40% szybsze uruchamianie „na zimno”, 30% mniej błędów typu „Aplikacja nie odpowiada” (ANR), 25% lepsze renderowanie klatek14% mniejszy rozmiar aplikacji.

Te ulepszenia są kluczowe dla zadowolenia użytkowników. Szybsze uruchamianie oznacza krótsze oczekiwanie i szybszy dostęp do treści. Mniejsza liczba błędów ANR oznacza bardziej stabilną i niezawodną aplikację, co zmniejsza frustrację użytkowników. Płynniejsze renderowanie klatek eliminuje zacinanie się interfejsu, dzięki czemu przewijanie i animacje są płynne i szybkie. Ten pozytywny wpływ techniczny był też wyraźnie widoczny w opiniach użytkowników.

Więcej informacji o tych ulepszeniach znajdziesz na naszym blogu.

Nietechniczne skutki uboczne korzystania z R8

Współpracując z partnerami, zauważyliśmy, że te ulepszenia techniczne mają bezpośredni wpływ na zadowolenie użytkowników i mogą się przekładać na utrzymanie użytkowników, ich zaangażowanie i długość sesji. Na regularność korzystania przez użytkowników, którą można mierzyć za pomocą liczby aktywnych użytkowników dziennie, tygodniowo lub miesięcznie, pozytywnie wpłynęły też ulepszenia techniczne. Widzimy, że oceny aplikacji w Sklepie Play rosną wraz z wdrażaniem R8. Udostępnienie tych informacji właścicielom produktów, dyrektorom ds. technologii i osobom decyzyjnym może przyspieszyć działanie aplikacji.

obraz.png

Nazwijmy to po imieniu: świadoma optymalizacja skuteczności to zaleta.

Wskazówki dotyczące aplikacji o większej skuteczności

Zauważyliśmy, że nasze wskazówki dla deweloperów dotyczące R8 wymagają ulepszenia. Zaczęliśmy więc działać. Wskazówki dla deweloperów dotyczące optymalizatora R8 są teraz bardziej praktyczne i zawierają kompleksowe informacje o tym, jak włączyć i debugować R8.

Dokumentacja zawiera ogólną strategię wdrażania, podkreślając znaczenie wyboru bibliotek przyjaznych optymalizacji i stopniowego wdrażania funkcji R8 w celu zapewnienia stabilności. Takie podejście etapowe pozwala bezpiecznie korzystać z zalet R8, a jednocześnie zapewnia wskazówki dotyczące problemów, które trudno debugować.

Znacznie rozszerzyliśmy wskazówki dotyczące reguł Keep, które są głównym mechanizmem sterowania optymalizatorem R8. Dodaliśmy sekcję, w której wyjaśniamy, czym są reguły przechowywania, jak je stosować oraz jak je tworzyć i utrzymywać zgodnie ze sprawdzonymi metodami. Podajemy też praktyczne przykłady użycia, które pomogą Ci zrozumieć, jak prawidłowo zapobiegać usuwaniu przez R8 kodu potrzebnego w czasie działania programu, np. kodu, do którego dostęp uzyskuje się za pomocą odbicia lub interfejsu natywnego JNI.

Dokumentacja obejmuje teraz również najważniejsze dalsze kroki i zaawansowane scenariusze. Dodaliśmy sekcję testowania i rozwiązywania problemów, aby umożliwić Ci weryfikowanie wzrostu wydajności i usuwanie potencjalnych problemów. W sekcji Konfiguracje zaawansowane znajdziesz informacje o tym, jak kierować reklamy na konkretne warianty kompilacji, dostosowywać, które zasoby mają być zachowane lub usunięte, oraz specjalne instrukcje optymalizacji dla autorów bibliotek. Dzięki temu możesz udostępniać innym deweloperom zoptymalizowany pakiet zgodny z R8.

Wykorzystaj pełen potencjał optymalizatora R8

Od wersji 8.0 wtyczki Androida do obsługi Gradle optymalizator R8 domyślnie używa „trybu pełnego”. Jeśli projekt jest rozwijany od wielu lat, może nadal zawierać starszą flagę, która wyłącza tę funkcję. Sprawdź, czy w pliku gradle.properties nie ma tego wiersza, i usuń go.

android.enableR8.fullMode=false // delete this line to enable R8's full potential

Teraz sprawdź, czy w pliku build.gradle.kts aplikacji masz włączoną funkcję R8 w przypadku wariantu wersji. Włącza się je przez ustawienie wartości true w polach isMinifyEnabled i isShrinkResources. Na tym etapie możesz też przekazać domyślne i niestandardowe pliki konfiguracyjne.

release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

       getDefaultProguardFile("proguard-android-optimize.txt"),

       "keep-rules.pro"

   )

}

Studium przypadku: ulepszenia wydajności Disney+

Inżynierowie z Disney+ dbają o wydajność aplikacji i optymalizują wrażenia użytkowników. Czasami nawet pozornie niewielkie zmiany mogą mieć ogromny wpływ. Podczas sprawdzania konfiguracji R8 zespół zauważył, że używana jest flaga -dontoptimize. Został on wprowadzony przez domyślny plik konfiguracji, który jest nadal używany w wielu aplikacjach.

Po zastąpieniu proguard-android.txt elementem proguard-android-optimize.txt zespół Disney+ zaobserwował znaczną poprawę wydajności aplikacji.

obraz.png

Po wdrożeniu nowej wersji aplikacji zawierającej tę zmianę Disney+ odnotował o 30% szybsze uruchamianie aplikacji i o 25% mniej błędów ANR widocznych dla użytkowników. 

Obecnie wiele aplikacji nadal używa pliku proguard-android.txt, który zawiera flagę -dontoptimize. Dlatego wprowadzamy ulepszenia w naszych narzędziach.

Pomoc dotycząca narzędzi

Począwszy od pakietu nowych funkcji Android Studio Narwhal 3, podczas korzystania z proguard-android.txt będzie wyświetlane ostrzeżenie lintera.

obraz.png

Od wersji AGP 9.0 całkowicie wycofujemy obsługę tego pliku. Oznacza to, że musisz przejść na proguard-android-optimize.txt.

Zainwestowaliśmy też w nowe funkcje Android Studio, aby debugowanie kodu zoptymalizowanego pod kątem R8 było łatwiejsze niż kiedykolwiek wcześniej. Od wersji AGP 9.0 możesz automatycznie odszyfrowywać ślady stosu w logcat w Android Studio w przypadku kompilacji przetwarzanych przez R8. Pomaga to wskazać dokładną linię kodu, która powoduje problem, nawet w w pełni zoptymalizowanej aplikacji. Więcej informacji na ten temat znajdziesz w jutrzejszym poście na blogu w ramach Tygodnia poświęconego wydajności Androida.

Kolejne kroki

Obejrzyj na YouTube wprowadzenie do optymalizatora R8 w ramach Tygodnia wyróżnień za skuteczność.

📣 Podejmij wyzwanie dotyczące skuteczności!

Czas przekonać się o korzyściach.

Zachęcamy do włączenia pełnego trybu R8 w swojej aplikacji już dziś.

  1. Aby rozpocząć, zapoznaj się z naszymi przewodnikami dla deweloperów: włącz optymalizację aplikacji.
  2. Sprawdź, czy nadal używasz proguard-android.txt, i zastąp go symbolem proguard-android-optimize.txt.
  3. Następnie zbadaj wpływ. Nie tylko poczuj różnicę, ale też ją sprawdź. Aby zmierzyć wzrost wydajności, dostosuj kod z naszej  przykładowej aplikacji do testów porównawczych na GitHubie i zmierz czasy uruchamiania przed i po wprowadzeniu zmian.

Jesteśmy przekonani, że zauważysz znaczną poprawę wyników aplikacji. W przypadku pytań dotyczących włączania R8 lub rozwiązywania problemów z nim używaj tagu #optimizationEnabled. Chętnie Ci pomożemy.

Przygotuj pytania na sesję „Ask Android” w piątek

Jeśli masz pytania dotyczące wydajności, użyj tagu społecznościowego #AskAndroid. Przez cały tydzień będziemy śledzić Twoje pytania i odpowiemy na kilka z nich podczas sesji „Zapytaj Androida” na temat wydajności w piątek 21 listopada. Jutro przyjrzymy się dokładniej debugowaniu i rozwiązywaniu problemów. Na razie jednak zacznij od R8 i przyspiesz rozwój swojej aplikacji.

Autor:

Czytaj dalej