R8: co to jest, możliwości i porównanie z ProGuard

Autor: IT Sectr Opublikowano: 2026-04-03 Czas czytania: 8 min

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 — następca ProGuard, zintegrowany z kompilatorem DEX, zastępujący ProGuard od AGP 8.0.
  • Kompresja kodu w R8 jest skuteczniejsza niż w ProGuard — usuwa do 15% więcej nieużywanych metod i klas.
  • Desugaring — wbudowane wsparcie konwersji składni Java 8+ na wstecznie kompatybilny kod.
  • Szybkość kompilacji z R8 jest o 20-30% wyższa dzięki integracji z kompilatorem DEX.
  • Zgodność ze składnią reguł ProGuard zapewnia bezproblemową migrację.

Czym jest R8?

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.

Architektura R8

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.

Historia rozwoju

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.

Kluczowe możliwości R8

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.

Minifikacja i kompresja kodu

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.

Desugaring Java 8+

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.

Optymalizacja na poziomie DEX

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.

groovy
// 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

Porównanie R8 i ProGuard

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.

ParametrR8ProGuard
IntegracjaWbudowany w kompilator DEXOddzielne narzędzie
Kompresja koduO 15% skuteczniejszaPoziom podstawowy
Szybkość kompilacjiO 20-30% szybszaPodstawowa szybkość
DesugaringWbudowanyNieobsługiwany
Zgodność regułPełna z ProGuardStandardowa składnia
Wsparcie AGP 8.0+Tak (standard)Nie (usunięty)

Rozmiar końcowego APK

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.

Zgodność z Kotlin

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 w projekcie Android

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.

Pełny tryb R8

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.

properties
# 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 *;
}

Debugowanie problemów R8

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.

Integracja z CI/CD

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.

Najlepsze praktyki pracy z R8

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.

Stopniowe wdrażanie

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.

Monitorowanie plików mapping

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.

Testowanie z R8 full mode

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.

Monitorowanie rozmiaru kompilacji

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.

kotlin
// 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

Czy trzeba instalować R8 osobno?

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.

Dlaczego R8 jest szybszy od ProGuard?

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.

Czy można wyłączyć R8 i wrócić do 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.

Jak R8 obsługuje korutyny Kotlin?

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.

Jakie błędy najczęściej występują przy przejściu na R8?

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

  • R8 — następca ProGuard, zintegrowany z kompilatorem DEX, zastępujący ProGuard od AGP 8.0.
  • Kompresja kodu R8 jest o 15% skuteczniejsza niż ProGuard, zmniejszając APK dodatkowo o 5-11 MB.
  • Szybkość kompilacji z R8 jest o 20-30% wyższa dzięki architekturze wielowątkowej.
  • Desugaring Java 8+ jest wbudowany w R8, eliminując potrzebę dodatkowych bibliotek.
  • Full mode włącza agresywne optymalizacje dla maksymalnej kompresji APK.
  • Zgodność reguł ProGuard z R8 zapewnia bezproblemową migrację istniejących projektów.
  • Pliki mapping R8 są obowiązkowe do przechowywania i integracji z Firebase Crashlytics.

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.

Omów projekt

Przeczytaj również