Aby zapewnić użytkownikom jak najlepsze wrażenia, zoptymalizuj aplikację, aby była jak najmniejsza i jak najszybsza. Nasz optymalizator aplikacji, R8, usprawnia aplikację, usuwając nieużywany kod i zasoby, przepisując kod w celu optymalizacji wydajności w czasie działania i wykonując inne działania. Dla użytkowników oznacza to:
- szybciej uruchamiać aplikację,
- Zmniejszone zużycie pamięci
- Lepsze renderowanie i wydajność w czasie działania
- Mniej błędów ANR
Omówienie optymalizacji R8
R8 optymalizuje aplikację pod kątem rozmiaru i szybkości w wielofazowym procesie. Kluczowe operacje to:
Zmniejszanie kodu (nazywane też usuwaniem nieużywanego kodu): R8 identyfikuje i usuwa nieosiągalny kod z aplikacji i jej zależności dotyczących biblioteki. Analizując punkty wejścia aplikacji (np.
ActivitieslubServiceszdefiniowane w manifeście), R8 tworzy wykres kodu, do którego istnieją odwołania, i usuwa wszystko, do czego nie ma odwołań.Optymalizacje logiczne: R8 przepisuje kod, aby zwiększyć wydajność wykonywania i zmniejszyć obciążenie. Najważniejsze techniki:
Wstawianie metod: R8 zastępuje miejsce wywołania metody rzeczywistą treścią wywoływanej metody. Eliminuje to narzut związany z wywołaniem funkcji i umożliwia R8 przeprowadzenie dalszych optymalizacji.
Scalanie klas: R8 łączy zestawy klas i interfejsów w jedną klasę. Zmniejsza to liczbę klas w aplikacji, co obniża obciążenie pamięci i przyspiesza uruchamianie.
Zaciemnianie kodu (nazywane też minifikacją): aby zmniejszyć rozmiar pliku DEX, R8 skraca nazwy klas, pól i metod (np.
com.example.MyActivitymoże stać sięa.b.a).
Od wersji 8.12.0 wtyczki Androida do obsługi Gradle (AGP) R8 optymalizuje też zasoby w ramach etapów optymalizacji. Więcej informacji znajdziesz w sekcji Optymalne zmniejszanie zasobów.
Włączanie optymalizacji
Aby włączyć optymalizację aplikacji, ustaw w skrypcie kompilacji na poziomie aplikacji wersji isMinifyEnabled = true (optymalizacja kodu) i isShrinkResources = true (optymalizacja zasobów), jak pokazano w tym kodzie. Zalecamy, aby zawsze włączać oba te ustawienia. Zalecamy też włączanie optymalizacji aplikacji tylko w ostatecznej wersji aplikacji, którą testujesz przed opublikowaniem – zwykle w kompilacji do publikacji. Optymalizacje wydłużają czas kompilacji projektu i mogą utrudniać debugowanie ze względu na sposób, w jaki modyfikują kod.
Kotlin
android { buildTypes { release { // Enables code-related app optimization. isMinifyEnabled = true // Enables resource shrinking. isShrinkResources = true proguardFiles( // Default file with automatically generated optimization rules. getDefaultProguardFile("proguard-android-optimize.txt"), ... ) ... } } ... }
Groovy
android { buildTypes { release { // Enables code-related app optimization. minifyEnabled true // Enables resource shrinking. shrinkResources true // Default file with automatically generated optimization rules. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') ... } } }
Optymalizacja zmniejszania zasobów w celu uzyskania jeszcze mniejszych aplikacji
Wtyczka Androida do obsługi Gradle (AGP) w wersji 8.12.0 wprowadza zoptymalizowane zmniejszanie zasobów, które ma na celu zintegrowanie optymalizacji zasobów i kodu, aby tworzyć jeszcze mniejsze i szybsze aplikacje.
Przed optymalizacją zmniejszania zasobów narzędzie Android Asset Packaging Tool (AAPT2) generowało reguły zachowywania, które traktowały zmniejszanie zasobów oddzielnie od kodu, często zachowując niedostępny kod lub zasoby, które się wzajemnie odwoływały.
W przypadku zoptymalizowanego zmniejszania zasobów są one traktowane jako część kodu programu, tworząc wykres odniesień. Jeśli zbiór kodu lub zasobów nie jest używany, nie jest chroniony przez regułę zachowywania i może zostać usunięty.
Włączanie optymalnego zmniejszania zasobów
Aby włączyć nowy zoptymalizowany potok zmniejszania zasobów w wersji AGP starszej niż 9.0.0, dodaj do pliku gradle.properties projektu ten kod:
android.r8.optimizedResourceShrinking=true
Jeśli używasz AGP w wersji 9.0.0 lub nowszej, nie musisz ustawiać
android.r8.optimizedResourceShrinking=true. Zoptymalizowane zmniejszanie zasobów jest stosowane automatycznie, gdy w konfiguracji kompilacji włączona jest opcja isShrinkResources = true.
Sprawdzanie i konfigurowanie ustawień optymalizacji R8
Aby włączyć w R8 pełne możliwości optymalizacji, usuń z pliku gradle.properties projektu ten wiersz (jeśli istnieje):
android.enableR8.fullMode=false # Remove this line from your codebase.
Pamiętaj, że włączenie optymalizacji aplikacji utrudnia zrozumienie śladów stosu, zwłaszcza jeśli R8 zmienia nazwy klas lub metod. Aby uzyskać ślady stosu, które prawidłowo odpowiadają kodowi źródłowemu, zapoznaj się z artykułem Przywracanie oryginalnego śladu stosu.
Jeśli R8 jest włączony, warto też utworzyć profile uruchamiania, aby jeszcze bardziej zwiększyć wydajność uruchamiania.
Jeśli włączenie optymalizacji aplikacji spowoduje błędy, możesz je naprawić, stosując te strategie:
- Dodaj reguły zachowywania, aby niektóre fragmenty kodu pozostały nietknięte.
- Stopniowe wprowadzanie optymalizacji
- Zaktualizuj kod, aby używać bibliotek lepiej dostosowanych do optymalizacji.
Jeśli chcesz zoptymalizować szybkość kompilacji, zapoznaj się z artykułem Skonfiguruj sposób działania R8, w którym znajdziesz informacje o konfigurowaniu R8 w zależności od środowiska.
Zmiany w działaniu wersji AGP i R8
W tabeli poniżej znajdziesz najważniejsze funkcje wprowadzone w różnych wersjach wtyczki Androida do obsługi Gradle (AGP) i kompilatora R8.
| Wersja AGP | Wprowadzone funkcje |
|---|---|
| 9.1 |
Klasy domyślnie przepakowane: R8 przepakowuje klasy (przenosząc je do nienazwanego pakietu na najwyższym poziomie), aby jeszcze bardziej skompaktować DEX, eliminując potrzebę określania opcji -repackageclasses. Informacje o tym, jak to działa i jak zrezygnować z tej funkcji, znajdziesz w sekcji opcje globalne.
|
| 9.0 |
Zoptymalizowane zmniejszanie zasobów: domyślnie włączone (sterowane za pomocą android.r8.optimizedResourceShrinking). Zoptymalizowane zmniejszanie zasobów pomaga zintegrować zmniejszanie zasobów z potokiem optymalizacji kodu, co prowadzi do tworzenia mniejszych i szybszych aplikacji. Optymalizując jednocześnie kod i odwołania do zasobów, identyfikuje i usuwa zasoby, do których odwołuje się wyłącznie nieużywany kod. Jest to znaczne ulepszenie w porównaniu z poprzednimi oddzielnymi procesami optymalizacji.Jest to szczególnie przydatne w przypadku aplikacji, które udostępniają znaczne zasoby i kod w różnych formatach, z mierzalnymi ulepszeniami o ponad 50% w rozmiarze aplikacji. Wynikające z tego zmniejszenie rozmiaru prowadzi do mniejszych plików do pobrania, szybszej instalacji i lepszych wrażeń użytkowników dzięki szybszemu uruchamianiu, lepszemu renderowaniu i mniejszej liczbie błędów ANR. Filtrowanie reguł biblioteki: obsługa opcji globalnych (np. -dontobfuscate) w regułach konsumenta biblioteki została wycofana, a aplikacje będą je odfiltrowywać. Więcej informacji znajdziesz w artykule Dodawanie opcji globalnych.Sprawdzanie wartości null w Kotlinie: domyślnie zoptymalizowane (kontrolowane za pomocą -processkotlinnullchecks). W tej wersji wprowadzono też znaczące ulepszenia szybkości kompilacji. Więcej informacji znajdziesz w artykule Opcje globalne dodatkowej optymalizacji.Optymalizowanie konkretnych pakietów: możesz użyć packageScope, aby optymalizować konkretne pakiety. Jest to funkcja eksperymentalna. Więcej informacji znajdziesz w artykule Optymalizowanie określonych pakietów za pomocą packageScope.Domyślnie zoptymalizowany: obsługa getDefaultProguardFile("proguard-android.txt") została wycofana, ponieważ zawiera -dontoptimize, którego należy unikać. Zamiast tego użyj zasady "proguard-android-optimize.txt". Jeśli chcesz globalnie wyłączyć optymalizację w aplikacji, ręcznie dodaj flagę do pliku ProGuard.
|
| 8.12 |
Zmniejszanie zasobów: dodano wstępną obsługę (domyślnie wyłączone). Włącz używanie isShrinkResources). Zmniejszanie zasobów działa w połączeniu z R8, aby skutecznie identyfikować i usuwać nieużywane zasoby.Śledzenie wsteczne w Logcat: obsługa automatycznego śledzenia wstecznego w oknie Logcat w Android Studio. |
| 8.6 |
Ulepszone śledzenie wsteczne: domyślnie obejmuje śledzenie wsteczne nazwy pliku i numeru wiersza na wszystkich poziomach minSdk (wcześniej wymagało to poziomu minSdk 26+ w wersji 8.2).Aktualizacja R8 pomaga zapewnić, że ślady stosu z zaciemnionych kompilacji są łatwo i wyraźnie czytelne. Ta wersja ulepsza mapowanie numerów wierszy i plików źródłowych, co ułatwia narzędziom takim jak Logcat w Android Studio automatyczne śledzenie awarii do oryginalnego kodu źródłowego. |
| z Androidem 8.0 |
Domyślnie tryb pełny: tryb pełny R8 zapewnia znacznie bardziej zaawansowaną optymalizację. Jest ona domyślnie włączona. Możesz zrezygnować na stronie android.enableR8.fullMode=false.
|
| 7,0 |
Dostępny tryb pełny: wprowadzony jako funkcja, którą można włączyć za pomocą android.enableR8.fullMode=true. Tryb pełny stosuje bardziej zaawansowane optymalizacje, ponieważ zakłada, że kod używa odbicia i innych funkcji dynamicznych. Chociaż zmniejsza rozmiar aplikacji i zwiększa jej wydajność, może wymagać dodatkowych reguł zachowywania, aby zapobiec usunięciu niezbędnego kodu.
|