Optymalizacja kodu DEX

Optymalizacja kodu DEX to funkcja Android Vitals, która pomaga monitorować i poprawiać jakość kompilacji, rozmiar i wydajność aplikacji. Optymalizacja i zaciemnianie kodu za pomocą R8 lub alternatywnych narzędzi (takich jak optymalizatory zgodne z ProGuard lub procesory końcowe DEX) zmniejsza rozmiar pliku DEX aplikacji, zwiększa wydajność środowiska wykonawczego i minimalizuje wykorzystanie pamięci.

Pliki DEX, czyli Dalvik Executable, zawierają skompilowany kod używany do uruchamiania aplikacji. Zazwyczaj obejmuje on kod Java i Kotlin, a nie skompilowany kod C++ ani pliki .so.

Raporty Android Vitals zawierają dane dotyczące optymalizacji kodu DEX w przypadku wszystkich aplikacji i gier, ale progi są egzekwowane tylko w przypadku aplikacji i gier, które spełniają określone wymagania dotyczące rozmiaru.

Wykrywanie problemu

Android Vitals może Cię powiadomić, gdy poziom optymalizacji kodu DEX w aplikacji jest niski. Obejmuje to zaciemnianie kodu, zmniejszanie rozmiaru i optymalizację w przypadku aplikacji i gier, które korzystają z R8. W przypadku aplikacji, które nie korzystają z R8, Android Vitals próbuje sprawdzić optymalizację, zmniejszanie i zaciemnianie, ale w razie potrzeby stosuje heurystykę zaciemniania jako przybliżenie.

Sprawdzanie stanu optymalizacji

Android Vitals może pomóc Ci poprawić działanie aplikacji, wysyłając alert w Konsoli Play za każdym razem, gdy aplikacja nie spełnia minimalnych określonych wartości procentowych optymalizacji kodu. Szczegółowe definicje zmniejszania, optymalizacji i zaciemniania znajdziesz w artykule Korzystanie z analizatora konfiguracji R8.

W przypadku aplikacji utworzonych przy użyciu najnowszej poprawki AGP w wersji 8.10 lub nowszej te wartości procentowe są pobierane z dołączonego pliku r8.json.

W przypadku starszych wersji AGP lub gdy plik r8.json nie jest uwzględniony, odsetki są obliczane na podstawie pliku mapping.txt (jeśli jest uwzględniony) lub przy użyciu heurystyki DEX (jeśli plik mapowania jest niedostępny).

W przypadku aplikacji zoptymalizowanych za pomocą alternatywnego optymalizatora kodu Android Vitals przeprowadza analizę, aby oszacować odsetek klas, metod i pól, które są zaciemnione w pakiecie aplikacji.

Minimalne rozmiary plików DEX

Android Vitals oblicza dane optymalizacji kodu dla wszystkich aplikacji, ale alerty otrzymasz tylko wtedy, gdy Twój pakiet aplikacji spełnia te wymagania dotyczące łącznego rozmiaru plików DEX:

  • Aplikacje: pakiet zawiera co najmniej 10 MB kodu DEX (rozmiar po rozpakowaniu).
  • Gry: pakiet zawiera co najmniej 50 MB kodu DEX (rozmiar po rozpakowaniu).

Android Vitals wyświetla rozmiar pliku DEX aplikacji, ale możesz też zmierzyć go lokalnie za pomocą wiersza poleceń:

  unzip -l <yourapp>.aab | grep -E '\.dex$' | awk '{sum+=$1} END {print sum}'

Lokalny pomiar optymalizacji kodu R8

Jeśli Twoja aplikacja jest optymalizowana za pomocą R8, możesz zmierzyć optymalizację, zaciemnianie i zmniejszanie rozmiaru pakietu aplikacji za pomocą analizatora konfiguracji R8. Raport Analizator konfiguracji R8 jest też dostępny w ramach umiejętności Analizator R8. Raport może Ci pomóc zrozumieć, jak reguły keep wpływają na wyniki optymalizacji, zmniejszania i zaciemniania, ale wartości procentowe w nim nie będą zgodne z wartościami w Android Vitals, ponieważ są one obliczane przed optymalizacjami.

Aby sprawdzić dokładne metadane, których Android Vitals używa do obliczania wyników, wyodrębnij plik r8.json z pakietu aplikacji:

unzip -p <yourapp>.aab BUNDLE-METADATA/com.android.tools/r8.json

Rozwiązanie problemu

Aby rozwiązać problem z niskimi wynikami optymalizacji kodu DEX, zapoznaj się z rekomendacjami dotyczącymi systemu kompilacji i optymalizatora:

Wtyczka Androida do obsługi Gradle i R8

Aby poprawić wyniki optymalizacji kodu DEX w R8, zapoznaj się z wskazówkami w artykule Ulepszanie optymalizacji R8. Możesz też skorzystać z umiejętności analizy R8, aby uzyskać dodatkowe wskazówki dotyczące optymalizacji reguł zachowywania w aplikacji.

Systemy kompilacji inne niż R8 i procesory końcowe DEX

Jeśli Twój potok kompilacji korzysta z niestandardowych narzędzi do kompilacji lub dodatkowych procesorów DEX, wykonaj te czynności, aby zwiększyć optymalizację aplikacji:

  • Otwórz pakiet aplikacji w Android Studio i wyświetl go w analizatorze APK.
  • Wybierz wszystkie .dexpliki.
  • Zwróć szczególną uwagę na pliki o największym rozmiarze, gdy będziesz przełączać przycisk „Deobfuscate names” (Uwaga: wymaga to przesłania mapping.txtpliku). Jeśli po zaciemnieniu niektóre z tych plików pozostają duże, prawdopodobnie podlegają regułom przechowywania obejmującym cały pakiet.
  • Sprawdź plik proguard-rules.pro, configuration.txt lub odpowiednik w przypadku optymalizatora, jeśli nie używasz R8, i wyszukaj reguły keep, które pasują do pakietów, które nie są zaciemniane. Jeśli np. com.foo. jest dużym pakietem w pliku DEX, poszukaj reguł zachowywania w formacie -keep com.foo.** lub -keep com.foo.bar.**.
  • Pamiętaj, że reguły przechowywania dla konsumentów bibliotek mogą nie być tak łatwe do zidentyfikowania. Jeśli podejrzewasz, że reguła konsumenta biblioteki ma wpływ na optymalizację, możesz sprawdzić to lokalnie, dodając ją do samodzielnej aplikacji przykładowej z użyciem najnowszej wersji AGP i sprawdzając ją za pomocą analizatora konfiguracji R8.