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 środowiska wykonawczego i wykonując inne działania. Dla użytkowników oznacza to:
- szybsze uruchamianie aplikacji,
- mniejsze zużycie pamięci,
- lepsze renderowanie i wydajność środowiska wykonawczego,
- mniej błędów ANR.
Omówienie optymalizacji R8
R8 używa wieloetapowego procesu optymalizacji aplikacji pod kątem rozmiaru i szybkości. Kluczowe operacje obejmują:
Zmniejszanie kodu (nazywane też usuwaniem nieużywanego kodu): R8 identyfikuje i usuwa nieosiągalny kod z aplikacji i jej zależności bibliotecznych. Analizując punkty wejścia aplikacji (np.
ActivitieslubServiceszdefiniowane w manifeście), R8 tworzy graf odwołań do kodu i usuwa wszystko, do czego nie ma odwołań.Optymalizacje logiczne: R8 przepisuje kod, aby zwiększyć wydajność wykonywania i zmniejszyć obciążenie. Kluczowe techniki obejmują:
Wstawianie metod: R8 zastępuje miejsce wywołania metody rzeczywistym ciałem wywoływanej metody. Eliminuje to obciążenie związane z wywołaniem funkcji i umożliwia R8 przeprowadzanie dalszych optymalizacji.
Scalanie klas: R8 łączy zestawy klas i interfejsów w jedną klasę. Zmniejsza to liczbę klas w aplikacji, co zmniejsza obciążenie pamięci i zwiększa szybkość uruchamiania.
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 swoich etapów optymalizacji. Więcej informacji znajdziesz w artykule Zoptymalizowane zmniejszanie zasobów.
Włączanie optymalizacji
Aby włączyć optymalizację aplikacji, ustaw isMinifyEnabled = true (w przypadku optymalizacji kodu)
i isShrinkResources = true (w przypadku optymalizacji zasobów) w skrypcie kompilacji na poziomie aplikacji w kompilacji do publikacji
, jak pokazano w tym kodzie. Zalecamy, aby zawsze włączać oba ustawienia. Zalecamy też włączanie optymalizacji aplikacji tylko w ostatecznej wersji aplikacji, którą testujesz przed opublikowaniem – zwykle w kompilacji do publikacji – ponieważ optymalizacje zwiększają czas kompilacji projektu i mogą utrudniać debugowanie ze względu na sposób modyfikowania kodu.
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"), ... ) ... } } ... }
Dynamiczny
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') ... } } }
Optymalizowanie zmniejszania zasobów w celu tworzenia jeszcze mniejszych aplikacji
Wersja 8.12.0 wtyczki Androida do obsługi Gradle (AGP) wprowadza zoptymalizowane zmniejszanie zasobów, które ma na celu zintegrowanie optymalizacji zasobów i kodu, aby tworzyć jeszcze mniejsze i szybsze aplikacje.
Przed zoptymalizowanym zmniejszaniem zasobów narzędzie Android Asset Packaging Tool (AAPT2) generowało reguły zachowania, które skutecznie traktowały zmniejszanie zasobów oddzielnie od kodu, często zachowując niedostępny kod lub zasoby, które odwoływały się do siebie.
W przypadku zoptymalizowanego zmniejszania zasobów zasoby są traktowane jako część kodu programu, tworząc graf odwołań. Gdy do kolekcji kodu lub zasobów nie ma odwołań, nie jest ona chroniona regułą zachowania i można ją usunąć.
Włączanie zoptymalizowanego zmniejszania zasobów
Aby włączyć nowy potok zoptymalizowanego zmniejszania zasobów w AGP 8.12 lub 8.13, dodaj te elementy do pliku gradle.properties projektu:
android.r8.optimizedResourceShrinking=true
Jeśli używasz AGP 9.0.0 lub nowszej wersji, 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 umożliwić R8 korzystanie z pełnych 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 zrzutó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, przeczytaj artykuł Odzyskiwanie oryginalnego śladu stosu.
Jeśli R8 jest włączony, utwórz też profile uruchamiania, aby jeszcze bardziej zwiększyć wydajność uruchamiania.
Jeśli włączenie optymalizacji aplikacji powoduje błędy, możesz je naprawić, stosując te strategie:
- Dodaj reguły zachowania, aby zachować część kodu bez zmian.
- Wdrażaj optymalizacje stopniowo.
- Zaktualizuj kod, aby używać bibliotek, które lepiej nadają się do optymalizacji.
Jeśli chcesz zoptymalizować szybkość kompilacji, przeczytaj artykuł Konfigurowanie sposobu działania R8 runs, aby dowiedzieć się, jak skonfigurować R8 na podstawie swojego środowiska.
Ulepszanie optymalizacji R8
Korzyści z wydajności R8 są bezpośrednio powiązane z tym, jak dużą część bazy kodu R8 może zoptymalizować. Aby w pełni wykorzystać możliwości R8, włącz R8 w trybie pełnym i dopracuj reguły zachowania, aby umożliwić maksymalną optymalizację klas, pól i metod.Aby Ci w tym pomóc, użyj analizatora konfiguracji R8.
Analizator konfiguracji R8 umożliwia:
- śledzenie i poprawianie ogólnej jakości konfiguracji R8 przez monitorowanie danych podanych w raporcie analizatora konfiguracji R8;
- znajdowanie najszerszych reguł zachowania, które uniemożliwiają największą optymalizację;
- poznawanie optymalizacji, które uniemożliwiają, aby je dopracować.
Analizator konfiguracji R8 jest dostępny w AGP w wersji 9.3.0-alpha05 lub w R8 w wersji 9.3.7-dev. Więcej informacji znajdziesz w artykule Analizowanie konfiguracji R8.
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 |
Domyślnie przepakowane klasy: R8 przepakowuje klasy (przenosząc je do nienazwanego pakietu na najwyższym poziomie), aby jeszcze bardziej skompaktować DEX, eliminując konieczność określania opcji -repackageclasses. Informacje o tym, jak to działa i jak zrezygnować, znajdziesz w sekcji Opcje globalne.
|
| 9.0 |
Zoptymalizowane zmniejszanie zasobów: domyślnie włączone (kontrolowane 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 odwołania do kodu i zasobów, identyfikuje i usuwa zasoby, do których odwołuje się wyłącznie nieużywany kod. Jest to znaczne ulepszenie w stosunku do poprzednich oddzielnych procesów optymalizacji.Jest to szczególnie przydatne w przypadku aplikacji, które współdzielą znaczne zasoby i kod w różnych formatach, z mierzalnymi ulepszeniami o ponad 50% w rozmiarze aplikacji. Dzięki zmniejszeniu rozmiaru pobieranie jest szybsze, instalacja szybsza, a wrażenia użytkowników lepsze 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). Ta wersja wprowadziła też znaczne ulepszenia w szybkości kompilacji. Więcej informacji znajdziesz w sekcji Opcje globalne dotyczące dodatkowej optymalizacji.Optymalizowanie określonych pakietów: możesz użyć packageScope, aby zoptymalizować określone pakiety. Jest to funkcja eksperymentalna. Więcej informacji znajdziesz w artykule Optymalizowanie określonych pakietów za pomocą packageScope.Domyślnie zoptymalizowane: obsługa getDefaultProguardFile("proguard-android.txt") została wycofana, ponieważ zawiera ona -dontoptimize, którego należy unikać. Zamiast tego użyj "proguard-android-optimize.txt". Jeśli musisz globalnie wyłączyć optymalizację w aplikacji, dodaj flagę ręcznie do pliku ProGuard.
|
| 8.12 |
Zoptymalizowane zmniejszanie zasobów: dodano wstępną obsługę (kontrolowaną za pomocą android.r8.optimizedResourceShrinking). Zoptymalizowane zmniejszanie zasobów pomaga zintegrować zmniejszanie zasobów z potokiem optymalizacji kodu. W tej wersji AGP musisz je włączyć ręcznie.Śledzenie w Logcat: obsługa automatycznego śledzenia w oknie Logcat w Android Studio. |
| 8.6 |
Ulepszone śledzenie: domyślnie obejmuje śledzenie nazwy pliku i numeru wiersza na wszystkich poziomach minSdk (wcześniej w wersji 8.2 wymagany był minSdk 26+).Aktualizowanie R8 pomaga zapewnić, że ślady stosu z zaciemnionych kompilacji są łatwo i wyraźnie czytelne. Ta wersja poprawia sposób mapowania 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. |
| 8.0 |
Domyślnie tryb pełny: tryb pełny R8 zapewnia znacznie większe możliwości optymalizacji. Jest domyślnie włączony. Możesz zrezygnować, używając android.enableR8.fullMode=false.
|
| 7.0 |
Dostępny tryb pełny: wprowadzony jako funkcja opcjonalna za pomocą android.enableR8.fullMode=true. Tryb pełny stosuje bardziej zaawansowane optymalizacje, przyjmując bardziej rygorystyczne założenia dotyczące sposobu, w jaki kod używa odbicia i innych funkcji dynamicznych. Zmniejsza rozmiar aplikacji i zwiększa wydajność, ale może wymagać dodatkowych reguł zachowania, aby zapobiec usunięciu niezbędnego kodu.
|