Analizator konfiguracji R8 to narzędzie, które pomaga maksymalizować korzyści z wydajności R8, dostarczając szczegółowych informacji o jakości konfiguracji aplikacji. Umożliwia śledzenie i ulepszanie optymalizacji R8 przez monitorowanie kluczowych wskaźników, a mianowicie wyników kompresji, optymalizacji i zaciemniania, które wskazują odsetek kodu dostępnego do optymalizacji. Analizator pomaga udoskonalać konfigurację, aby R8 mógł skutecznie optymalizować jak najwięcej klas, pól i metod. W tym celu analizator identyfikuje ogólne lub niepotrzebne reguły zachowywania, w tym te wprowadzone przez biblioteki innych firm.
Generowanie raportu
W przypadku AGP w wersji 9.3.0 lub nowszej możesz wygenerować raport analizatora konfiguracji R8 za pomocą specjalnego samodzielnego zadania Gradle lub automatycznie podczas kompilacji R8.
Uruchom samodzielne zadanie Gradle (zalecane do użytku lokalnego)
Podczas aktywnego iteracyjnego tworzenia reguł zachowywania używaj samodzielnego zadania Gradle, aby szybko ocenić wpływ zmian bez pełnego tworzenia pliku APK lub pakietu:
./gradlew :app:analyzeReleaseR8Config
Ponieważ to zadanie pomija generowanie pliku APK lub pakietu, zapewnia znacznie krótszą pętlę opinii. Dzięki temu możesz szybko przeanalizować, jak reguły zachowywania wpływają na zmniejszanie, optymalizację i zaciemnianie, oraz od razu je dopracować. Raport HTML jest generowany w lokalizacji app/build/reports/r8/r8-config-analyzer-release.html.
Generowanie automatyczne podczas regularnych kompilacji
Podczas tworzenia pełnej wersji R8 (np. assembleRelease) raport jest generowany automatycznie w lokalizacji build/outputs/mapping/release/configanalyzer.html.
Aby wyłączyć automatyczne generowanie danych wyjściowych podczas zwykłych kompilacji, ustaw tę właściwość Gradle:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Wtyczka Androida do obsługi Gradle w wersji 9.2 i starszych
W przypadku wtyczki AGP w wersji 9.2 i starszych ustaw właściwość systemową
com.android.tools.r8.dumpkeepradiushtmltodirectory podczas uruchamiania zadania Gradle z kompilacją włączoną za pomocą R8.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
Aby na przykład wygenerować raport HTML w katalogu /tmp/r8analysis, użyj tego polecenia:
# To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis
# To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis
Interpretowanie raportu
Analizator konfiguracji R8 dostarcza informacji o konfiguracji R8 aplikacji i wpływie każdej reguły zachowywania na aplikację. Pomaga to uzyskać maksymalną optymalizację R8, co zwiększa wydajność aplikacji. Skorzystaj z tych wyników, aby dowiedzieć się, jaka część Twojego kodu jest dostępna do optymalizacji przez R8.
Wynik zmniejszania rozmiaru
Gdy R8 zmniejsza rozmiar aplikacji, identyfikuje i usuwa nieużywany kod oraz zasoby, co pozwala zmniejszyć ogólny rozmiar aplikacji i zapewnić, że ostateczna kompilacja będzie jak najmniejsza. Wartość zmniejszania śledzi odsetek klas, pól i metod, które podlegają zmniejszaniu. Na przykład wynik 66% oznacza, że R8 może przeprowadzić zmniejszanie w 66% kodu.
Wynik optymalizacji
R8 przeprowadza optymalizacje, takie jak wstawianie metod i scalanie klas, co poprawia uruchamianie aplikacji i zmniejsza jej zapotrzebowanie na pamięć. Wynik optymalizacji śledzi odsetek klas, pól i metod, które podlegają optymalizacjom R8. Jeśli na przykład wynik optymalizacji wynosi 66%, oznacza to, że R8 może przeprowadzić optymalizację tylko w 66% kodu.
Wynik zaciemnienia kodu
Zaciemniając klasy, pola i metody, R8 skraca nazwy i zmniejsza rozmiar metadanych aplikacji, co pozwala oszczędzać pamięć. Wynik zaciemniania określa odsetek kodu w bazie kodu, który można zaciemnić.
Uściślanie reguł przechowywania
Aby poprawić wyniki i odblokować lepszą optymalizację R8, musisz dopracować reguły zachowywania, aby niepotrzebnie nie uniemożliwiały R8 optymalizacji aplikacji. Zachowuj tylko klasy, metody lub pola, do których uzyskuje się dostęp za pomocą odbicia.
Aby to zrobić, użyj analizy reguł zachowywania.
Aby wyświetlić szczegółową analizę reguły, kliknij ją, aby otworzyć ekran szczegółów.
Jak doprecyzować reguły przechowywania
Aby dopracować reguły zachowywania i w pełni wykorzystać potencjał optymalizacji R8 w przypadku aplikacji:
- W narzędziu Configuration Analyzer możesz sprawdzić, jaki odsetek klas, pól i metod nie może zostać zoptymalizowany przez R8 w przypadku każdej reguły zachowywania. Użyj tego, aby zidentyfikować reguły zachowywania, które uniemożliwiają optymalizację w dużej liczbie klas, pól lub metod. Wymienione są też właściwości optymalizacji, które są blokowane przez poszczególne reguły zachowywania.
- Jeśli widzisz regułę zachowywania, która uniemożliwia optymalizację dużej liczby klas, sprawdź, które klasy, pola i metody są chronione przed optymalizacją przez tę regułę. Zobacz, czy reguła zachowywania nie chroni elementów, które nie są wywoływane dynamicznie za pomocą refleksji.
- Ogranicz blokowanie optymalizacji przez reguły zachowywania, kierując reklamy tylko na niezbędne klasy, pola lub metody, wybierając odpowiednią opcję zachowywania i stosując sprawdzone metody.
- Przeprowadź testy, które obejmują klasy, pola i metody, których dotyczy reguła zachowywania, i dopracuj reguły zachowywania.
Sprawdzanie optymalizacji bibliotek
Gdy integrujesz biblioteki zewnętrzne, często zawierają one własne reguły przechowywania dla konsumentów, które współpracują z R8. Autor biblioteki nie może przewidzieć Twojej konkretnej implementacji, dlatego czasami pisze zachowawcze, szeroko zakrojone reguły, które uniemożliwiają optymalizację w większej liczbie klas, pól i metod niż jest to konieczne. Może to uniemożliwić optymalizację przez R8 części aplikacji, które nie mają nic wspólnego z rzeczywistym działaniem biblioteki. Za pomocą narzędzia R8 Configuration Analyzer możesz identyfikować biblioteki wprowadzające reguły, które negatywnie wpływają na optymalizację aplikacji.
Użyj analizatora konfiguracji, aby sprawdzić łączny efekt wszystkich scalonych reguł przechowywania danych konsumenckich. Analizując wpływ każdej reguły zachowywania pochodzącej z biblioteki innej firmy, możesz identyfikować i śledzić konkretne biblioteki innych firm, które uniemożliwiają przeprowadzenie w aplikacji dużej liczby optymalizacji.
Optymalizacja bibliotek
Aby rozwiązać problem z regułami zachowywania wprowadzonymi przez biblioteki innych firm:
- Jeśli biblioteka zawiera zbyt ogólną regułę, zalecamy skontaktowanie się z osobą zarządzającą biblioteką i przesłanie jej danych z raportu, aby pokazać, jak obecne reguły wpływają na wyniki optymalizacji aplikacji. Jeśli jest to biblioteka zewnętrzna, przed zgłoszeniem problemu sprawdź, czy nie ma w niej już zgłoszonych błędów.
- W razie potrzeby możesz przetestować potencjalne ulepszenia, filtrując reguły z określonej biblioteki. Możesz zaimportować reguły biblioteki do projektu, wykluczyć ogólne reguły i ponownie uruchomić analizator konfiguracji, aby zmierzyć potencjalne korzyści w zakresie rozmiaru i wydajności.
Reguły podrzędne
Może się zdarzyć, że kilka reguł zachowywania będzie się nakładać, a jedna z nich może uniemożliwiać optymalizację w większym stopniu niż jest to konieczne. Jeśli w Twojej bazie kodu znajdują się 2 reguły keep.
# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }
# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass
Pierwsza reguła zachowywania, która zapobiega optymalizacji całego pakietu, obejmuje drugą regułę zachowywania, która jest kierowana na klasę w pakiecie zachowanym przez pierwszą regułę zachowywania. Gdy reguły zachowywania się pokrywają, jedna z nich może blokować więcej optymalizacji niż jest to konieczne. Dzięki dopracowaniu tych pokrywających się reguł możesz zmaksymalizować optymalizację R8 i wyeliminować dług techniczny. Ten proces polega na uproszczeniu konfiguracji, aby zachować tylko niezbędny kod, a jednocześnie w pełni wykorzystać możliwości optymalizacji R8.
Optymalizacja reguł podrzędnych
- Znajdź reguły zachowywania, które są zastępowane przez inne reguły, za pomocą analizatora konfiguracji R8.
- Określ dokładne klasy, pola lub metody w bazie kodu, które faktycznie korzystają z odbicia i muszą być zachowane za pomocą reguł keep. Ta wiedza pomoże Ci dopracować reguły przechowywania.
- Za pomocą analizatora konfiguracji porównaj wpływ poszczególnych reguł kierowanych na te same klasy, pola lub metody. Możesz użyć odsetka optymalizacji zapobiegniętej przez każdą regułę zachowywania, aby określić, która z nich jest szersza, a która węższa.
- Jeśli wąska reguła jest napisana precyzyjnie – zachowuje tylko dokładnych członków lub klasy, do których uzyskuje się dostęp przez odbicie – usuń szerszą regułę zachowywania. Bezpiecznie odblokowuje to optymalizacje R8 w pozostałej części pakietu.
- Jeśli przybliżona reguła kieruje reklamy na odpowiednie klasy, zachowaj ją i usuń regułę szczegółową. Cienka linia jest po prostu zbędnym elementem. Upewnij się, że ogólna reguła została doprecyzowana tak, aby obejmowała tylko zidentyfikowane przez Ciebie klasy, pola lub metody.
Sprawdź i przetestuj zmiany: ponownie uruchom analizator konfiguracji, aby upewnić się, że konflikt został rozwiązany. Następnie skompiluj wersję do publikacji i przetestuj zmiany, aby upewnić się, że baza kodu działa zgodnie z oczekiwaniami.
Usuwanie niepotrzebnych reguł
Za pomocą analizatora konfiguracji możesz systematycznie sprawdzać bazę kodu, aby identyfikować i usuwać przestarzałe reguły zachowywania, które zaśmiecają konfigurację. Analizator konfiguracji R8 wyróżnia 2 główne źródła zbędnych reguł:
- Nieużywane reguły: reguły, które nie pasują do żadnych klas, metod ani pól w bieżącej kompilacji. Często pozostają one po refaktoryzacji kodu, usunięciu zależności lub skopiowaniu i wklejeniu konfiguracji, które nie są już istotne, co niepotrzebnie komplikuje konfigurację.
- Identyczne reguły: identyczne reguły przechowywania to reguły, które są kierowane na te same klasy, pola i metody lub zduplikowane deklaracje reguły przechowywania w tym samym lub w różnych plikach reguł przechowywania.
Oba typy reguł powodują bałagan w konfiguracji, co utrudnia jej utrzymanie i debugowanie. Dzięki temu możesz uporządkować konfigurację.