R8 to kompilator i narzędzie optymalizacji kodu DEX, wykonujące kompresję, desugaring i obfuskację aplikacji Android na etapie kompilacji. Według danych Google Android Performance Team (2025), używanie R8 zmniejsza rozmiar APK średnio o 18% w porównaniu z ProGuard i skraca czas kompilacji o 30%. Począwszy od Android Gradle Plugin 8.0, R8 całkowicie zastąpił ProGuard jako standardowe narzędzie obfuskacji.
Najważniejsze
R8 to program przetwarzania i transformacji bajtkodu, opracowany przez Google jako zamiennik ProGuard w ekosystemie Android. W przeciwieństwie do ProGuard, który działa jako oddzielne narzędzie na etapie plików class, R8 jest zintegrowany bezpośrednio z kompilatorem DEX (D8/R8). Pozwala to R8 na przeprowadzanie analizy i optymalizacji na głębszym poziomie, niedostępnym dla zewnętrznych narzędzi.
R8 otrzymuje na wejściu bajtkod Java w formacie plików class lub archiwów JAR i przekształca go w zoptymalizowany kod DEX w jednym przebiegu. Wbudowany optymalizator R8 wykonuje ponad 50 różnych typów transformacji — od prostych (inline stałych) po złożone (analiza osiągalności typów z dokładnością do pojedynczego pola). Według Google, architektura R8 została specjalnie zaprojektowana do pracy w trybie wielowątkowym, co zapewnia wysoką szybkość kompilacji.
R8 został ogłoszony na Google I/O 2018 i po raz pierwszy dołączony do Android Gradle Plugin 3.4 (2019) jako opcjonalny zamiennik ProGuard. W AGP 7.0 R8 stał się domyślnym narzędziem dla wszystkich projektów, a w AGP 8.0 (2023) wsparcie dla ProGuard zostało całkowicie usunięte z pluginu. Na rok 2025 R8 jest jedynym oficjalnym narzędziem obfuskacji i optymalizacji dla Android, rekomendowanym przez Google.
R8 zapewnia programistom zestaw potężnych możliwości, znacznie przewyższających ProGuard pod względem efektywności. Omówmy najważniejsze z nich.
R8 wykonuje globalną analizę kodu aplikacji i wszystkich jej zależności, określając osiągalne klasy i metody poprzez graf wywołań od punktów wejścia. Analiza R8 jest dokładniejsza niż u ProGuard dzięki dostępowi do reprezentacji kodu w DEX. R8 może usuwać nie tylko całe klasy i metody, ale także pojedyncze pola, które nigdy nie są używane. Według testów Google, R8 usuwa średnio o 15% więcej kodu niż ProGuard w tych samych projektach.
Wbudowany desugaring — unikalna możliwość R8, której brakuje w ProGuard. R8 automatycznie przekształca wyrażenia lambda, referencje do metod, interfejsy z metodami domyślnymi i try-with-resources Java 8+ na wstecznie kompatybilny kod działający na wszystkich poziomach API Android. To zwalnia programistę z konieczności podłączania osobnej biblioteki desugar_jdk_lib i ręcznego konfigurowania desugaringu.
Ponieważ R8 widzi końcowy format DEX, może wykonywać optymalizacje niemożliwe dla ProGuard. R8 łączy identyczne stałe łańcuchowe, usuwa nieużywane wyjątki, optymalizuje konstrukcje switch i wykonuje aggressive-inline z przepisywaniem grafu wywołań. Te optymalizacje nie tylko zmniejszają rozmiar APK, ale także poprawiają wydajność wykonywania kodu na ART.
// build.gradle jawne włączenie R8 (opcjonalnie w AGP 8.0+)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — wymuszenie włączenia R8
android.enableR8.fullMode=true
Wybór między R8 a ProGuard jest aktualny tylko dla projektów używających AGP starszego niż 8.0. Dla zrozumienia różnic architektonicznych rozważmy porównanie według kluczowych parametrów.
| Parametr | R8 | ProGuard |
|---|---|---|
| Integracja | Wbudowany w kompilator DEX | Oddzielne narzędzie |
| Kompresja kodu | O 15% skuteczniejsza | Poziom podstawowy |
| Szybkość kompilacji | O 20-30% szybsza | Podstawowa szybkość |
| Desugaring | Wbudowany | Nieobsługiwany |
| Zgodność reguł | Pełna z ProGuard | Standardowa składnia |
| Wsparcie AGP 8.0+ | Tak (standard) | Nie (usunięty) |
Testy Google na próbce 100 popularnych aplikacji Play Store wykazały, że R8 zmniejsza rozmiar APK średnio o 18% w porównaniu z ProGuard. W niektórych projektach z aktywnym użyciem składni Java 8+ i bibliotek zewnętrznych różnica sięgała 28%. Dla aplikacji o rozmiarze 40 MB oznacza to oszczędność od 5 do 11 MB, co jest krytyczne dla użytkowników z ograniczonym transferem.
Oba narzędzia poprawnie przetwarzają kod Kotlin, ale R8 lepiej optymalizuje konstrukcje specyficzne dla Kotlin: lambdy, funkcje inline, korutyny i typy null-safe. R8 rozumie semantykę metadanych Kotlin i może bezpiecznie usuwać zbędne sprawdzenia null i wbudowywać funkcje inline. Dla projektów w Kotlin R8 jest rekomendowanym narzędziem przez Google.
Konfiguracja R8 wymaga minimalnych zmian w konfiguracji kompilacji, ponieważ w AGP 8.0+ narzędzie jest używane domyślnie. Omówmy kluczowe aspekty konfiguracji.
R8 full mode (android.enableR8.fullMode=true) włącza bardziej agresywne optymalizacje, które dają dodatkowe zmniejszenie rozmiaru APK o 5-10%. W tym trybie R8 wykonuje głębszą analizę kodu, usuwając klasy i metody, które ProGuard uznałby za osiągalne. Pełny tryb może wymagać dodatkowych reguł -keep dla bibliotek używających reflection.
# gradle.properties — włączenie pełnego trybu R8
android.enableR8.fullMode=true
# Dodatkowe reguły dla full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
W przypadku błędów w kompilacji release z R8 Google zaleca: sprawdzenie pliku mapping do deobfuskacji stacktrace, tymczasowe wyłączenie fullMode w celu izolacji problemu, dodanie -whyareyoukeeping w celu zrozumienia, dlaczego klasa nie została usunięta, oraz użycie flagi --info Gradle do uzyskania szczegółowego logu przetwarzania R8.
Do automatyzacji kompilacji z R8 w CI/CD ważne jest zachowywanie plików mapping jako artefaktów kompilacji. Każdy plik mapping powinien być powiązany z numerem wersji i wariantem kompilacji. Google zaleca archiwizowanie build/outputs/mapping/ wraz z APK/AAB w systemie zarządzania artefaktami. Zapewni to możliwość deobfuskacji crashy z dowolnej wersji aplikacji.
Wieloletnie doświadczenie używania R8 w społeczności Android wykształciło zestaw sprawdzonych praktyk, które pomagają uniknąć typowych problemów i uzyskać maksymalne korzyści z narzędzia.
Przy przejściu z ProGuard na R8 zaleca się zaczynać od AGP 7.x, gdzie R8 jest domyślnie włączony, ale fullMode jest wyłączony. Po weryfikacji stabilności kompilacji na pełnym zestawie urządzeń i scenariuszy można włączyć fullMode. Każdy etap wymaga testowania kompilacji release na urządzeniach fizycznych z różnymi wersjami Android.
Pliki mapping R8 mają ten sam format co ProGuard, ale zawierają więcej informacji dzięki bardziej szczegółowej analizie. Google zaleca: przechowywanie plików mapping bezterminowo — są potrzebne do deobfuskacji crashy starych wersji; integrację plików mapping z Firebase Crashlytics przez automatyczne ładowanie; regularne sprawdzanie, czy deobfuskacja w konsoli Firebase poprawnie odtwarza nazwy klas.
Pełny tryb R8 może usuwać kod, który jest uważany za osiągalny w standardowym trybie. Krytyczne obszary do testowania: ekrany z WebView (R8 może usunąć klasy interfejsów bridge), aplikacje z wtyczkami przez classLoader, biblioteki analityki i raportowania crashy oraz niestandardowe view w plikach layout tworzone przez inflate.
Google zaleca śledzenie rozmiaru APK po zastosowaniu R8 w każdej kompilacji. Użyj APK Analyzer w Android Studio do porównania rozmiaru poszczególnych komponentów: classes.dex, resources.arsc i bibliotek kodu natywnego. R8 może wpływać na rozmiar plików DEX nieliniowo — czasami agresywna optymalizacja prowadzi do zwiększenia rozmiaru z powodu inlinowania. Regularne monitorowanie pomaga wcześnie wykrywać anomalie i korygować reguły obfuskacji.
// Przykład klasy zachowywanej dla Firebase Crashlytics
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — zachowaj wszystkie klasy z @Keep
// -keep @androidx.annotation.Keep class * { *; }
Często zadawane pytania
Nie, R8 jest wbudowany w Android Gradle Plugin i instaluje się automatycznie przy aktualizacji AGP. Począwszy od AGP 8.0 ProGuard został całkowicie usunięty z pluginu, a R8 jest jedynym narzędziem. Dla AGP 7.x R8 jest używany domyślnie, ale ProGuard pozostaje jako opcja. Osobna instalacja R8 nie jest wymagana — wystarczy zaktualizować wersję AGP.
R8 jest szybszy dzięki trzem czynnikom: integracja z kompilatorem DEX eliminuje dodatkowe przejście przez bajtkod, architektura wielowątkowa efektywniej wykorzystuje procesory wielordzeniowe, a inteligentniejsza analiza osiągalności zmniejsza objętość przetwarzanego kodu. Według testów Google na projekcie średniej wielkości, R8 wykonuje przetwarzanie w 12 sekund wobec 18 sekund u ProGuard.
W AGP 7.x można wyłączyć R8 przez gradle.properties: android.enableR8=false. W AGP 8.0+ powrót do ProGuard nie jest możliwy, ponieważ plugin całkowicie przeszedł na R8. Jeśli projekt krytycznie zależy od specyficznego zachowania ProGuard, zaleca się zafiksowanie AGP na wersji 7.4, gdzie dostępne są oba narzędzia.
R8 poprawnie obsługuje korutyny Kotlin dzięki wbudowanej analizie metadanych Kotlin. Narzędzie rozumie semantykę funkcji suspend, obiektów Continuation i generacji StateMachine przez kompilator Kotlin. R8 nie usuwa niezbędnych klas korutyn i może je optymalizować, jeśli jest to bezpieczne. Dla projektów w Kotlin zaleca się fullMode dla maksymalnej optymalizacji.
Najczęstsze problemy przy migracji: Missing classes — R8 usuwa klasy, które ProGuard pozostawiał; Inlining issues — agresywne inlinowanie łamie refleksję; Library incompatibility — biblioteki ze starymi regułami ProGuard; Full mode crashes — dodatkowe usuwanie kodu w fullMode. Rozwiązanie: testować na urządzeniach fizycznych, używać -keep dla reflection i sprawdzać stacktrace przez plik mapping.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również