R8: co to je, možnosti a srovnání s ProGuardem

Autor: IT Sectr Publikováno: 2026-04-03 Doba čtení: 8 min

R8 je kompilátor a nástroj pro optimalizaci DEX kódu, který provádí kompresi, desugaring a obfuskaci Android aplikací ve fázi sestavení. Podle údajů Google Android Performance Team (2025) použití R8 snižuje velikost APK v průměru o 18 % ve srovnání s ProGuardem a zkracuje dobu sestavení o 30 %. Od Android Gradle Plugin 8.0 R8 zcela nahradil ProGuard jako standardní nástroj pro obfuskaci.

Hlavní body

  • R8 je nástupce ProGuardu integrovaný do DEX kompilátoru, který nahrazuje ProGuard od AGP 8.0.
  • Komprese kódu v R8 je efektivnější než v ProGuardu — odstraňuje až o 15 % více nepoužívaných metod a tříd.
  • Desugaring — vestavěná podpora převodu syntaxe Java 8+ na zpětně kompatibilní kód.
  • Rychlost sestavení s R8 je o 20–30 % vyšší díky integraci do DEX kompilátoru.
  • Kompatibilita se syntaxí pravidel ProGuard zajišťuje transparentní migraci.

Co je R8?

R8 je program pro zpracování a transformaci bajtkódu vyvinutý společností Google jako náhrada ProGuardu v ekosystému Android. Na rozdíl od ProGuardu, který funguje jako samostatný nástroj ve fázi class souborů, je R8 integrován přímo do DEX kompilátoru (D8/R8). To umožňuje R8 provádět analýzu a optimalizaci na hlubší úrovni, která není dostupná pro externí nástroje.

Architektura R8

R8 přijímá na vstupu Java bajtkód ve formátu class souborů nebo JAR archivů a transformuje jej do optimalizovaného DEX kódu v jediném průchodu. Vestavěný optimalizátor R8 provádí více než 50 různých typů transformací — od jednoduchých (inlining konstant) až po složité (analýza dosažitelnosti typů s přesností na jednotlivé pole). Podle Googlu je architektura R8 speciálně navržena pro práci ve vícevláknovém režimu, což zajišťuje vysokou rychlost sestavení.

Historie vývoje

R8 byl oznámen na Google I/O 2018 a poprvé zařazen do Android Gradle Plugin 3.4 (2019) jako volitelná náhrada ProGuardu. V AGP 7.0 se R8 stal výchozím nástrojem pro všechny projekty a v AGP 8.0 (2023) byla podpora ProGuardu z pluginu zcela odstraněna. Od roku 2025 je R8 jediným oficiálním nástrojem pro obfuskaci a optimalizaci pro Android doporučeným společností Google.

Klíčové možnosti R8

R8 poskytuje vývojářům sadu výkonných funkcí, které výrazně převyšují ProGuard z hlediska efektivity. Pojďme si prohlédnout ty hlavní.

Minifikace a komprese kódu

R8 provádí globální analýzu kódu aplikace a všech jejích závislostí, přičemž určuje dosažitelné třídy a metody prostřednictvím grafu volání z vstupních bodů. Analýza R8 je přesnější než u ProGuardu díky přístupu k DEX reprezentaci kódu. R8 může odstraňovat nejen celé třídy a metody, ale i jednotlivá pole, která nejsou nikdy použita. Podle testů Googlu odstraňuje R8 v průměru o 15 % více kódu než ProGuard na stejných projektech.

Desugaring Java 8+

Vestavěný desugaring je unikátní funkce R8, která v ProGuardu chybí. R8 automaticky převádí lambda výrazy, method references, rozhraní s default metodami a try-with-resources z Java 8+ na zpětně kompatibilní kód fungující na všech úrovních Android API. To zbavuje vývojáře nutnosti připojovat samostatnou knihovnu desugar_jdk_libs a ručně konfigurovat desugaring.

Optimalizace na úrovni DEX

Protože R8 vidí výsledný DEX formát, může provádět optimalizace, které nejsou pro ProGuard možné. R8 slučuje stejné řetězcové konstanty, odstraňuje nepoužívané výjimky, optimalizuje switch konstrukce a provádí agresivní inlining s přepisováním grafu volání. Tyto optimalizace nejen zmenšují velikost APK, ale také zlepšují výkon provádění kódu na ART.

groovy
// build.gradle explicitní povolení R8 (volitelné v AGP 8.0+)
android {
    compileSdk 34
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'
            ), 'proguard-rules.pro'
        }
    }
}

// gradle.properties — vynutit povolení R8
android.enableR8.fullMode=true

Srovnání R8 a ProGuardu

Volba mezi R8 a ProGuardem je relevantní pouze pro projekty používající AGP starší než 8.0. Pro pochopení architektonických rozdílů se podívejme na srovnání podle klíčových parametrů.

ParametrR8ProGuard
IntegraceVestavěn v DEX kompilátoruSamostatný nástroj
Komprese kóduO 15 % efektivnějšíZákladní úroveň
Rychlost sestaveníO 20–30 % rychlejšíZákladní rychlost
DesugaringVestavěnýNepodporován
Kompatibilita pravidelPlná s ProGuardemStandardní syntaxe
Podpora AGP 8.0+Ano (standard)Ne (odstraněn)

Velikost výsledného APK

Testování Googlu na vzorku 100 populárních aplikací z Play Store ukázalo, že R8 zmenšuje velikost APK v průměru o 18 % ve srovnání s ProGuardem. U některých projektů s aktivním použitím syntaxe Java 8+ a knihoven třetích stran dosahoval rozdíl až 28 %. U aplikace o velikosti 40 MB to znamená úsporu 5 až 11 MB, což je kritické pro uživatele s omezeným datovým tarifem.

Kompatibilita s Kotlinem

Oba nástroje správně zpracovávají Kotlin kód, ale R8 lépe optimalizuje Kotlin-specifické konstrukce: lambdy, inline funkce, korutiny a null-safe typy. R8 rozumí sémantice Kotlin metadat a může bezpečně odstraňovat zbytečné null kontroly a vkládat inline funkce. Pro projekty v Kotlinu je R8 doporučeným nástrojem od Googlu.

Nastavení R8 v Android projektu

Nastavení R8 vyžaduje minimální změny v konfiguraci sestavení, protože v AGP 8.0+ se nástroj používá ve výchozím nastavení. Podívejme se na klíčové aspekty konfigurace.

Plný režim R8

R8 full mode (android.enableR8.fullMode=true) zapíná agresivnější optimalizace, které poskytují dodatečné zmenšení velikosti APK o 5–10 %. V tomto režimu R8 provádí hlubší analýzu kódu a odstraňuje třídy a metody, které by ProGuard považoval za dosažitelné. Plný režim může vyžadovat dodatečná pravidla -keep pro knihovny používající reflection.

properties
# gradle.properties — povolení plného režimu R8
android.enableR8.fullMode=true

# Další pravidla pro full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}

Ladění problémů s R8

Při výskytu chyb v release sestavení s R8 Google doporučuje: zkontrolovat mapping soubor pro deobfuskaci stack trace, dočasně vypnout fullMode pro izolaci problému, přidat -whyareyoukeeping pro pochopení, proč třída nebyla odstraněna, a použít příznak --info v Gradle pro získání podrobného logu zpracování R8.

Integrace s CI/CD

Pro automatizaci sestavení s R8 v CI/CD je důležité uchovávat mapping soubory jako artefakty sestavení. Každý mapping soubor musí být svázán s číslem verze a variantou sestavení. Google doporučuje archivovat build/outputs/mapping/ spolu s APK/AAB do systému správy artefaktů. To zajistí možnost deobfuskace pádů z jakékoli verze aplikace.

Nejlepší postupy práce s R8

Dlouholeté zkušenosti s používáním R8 v Android komunitě vytvořily sadu osvědčených postupů, které pomáhají vyhnout se typickým problémům a získat z nástroje maximum.

Postupné zavádění

Při přechodu z ProGuardu na R8 se doporučuje začít s AGP 7.x, kde je R8 ve výchozím nastavení zapnut, ale fullMode je vypnut. Po ověření stability sestavení na plné sadě zařízení a scénářů lze zapnout fullMode. Každá fáze vyžaduje testování release sestavení na fyzických zařízeních s různými verzemi Androidu.

Monitorování mapping souborů

Mapping soubory R8 mají stejný formát jako ProGuard, ale obsahují více informací díky podrobnější analýze. Google doporučuje: uchovávat mapping soubory neomezeně dlouho — jsou potřeba pro deobfuskaci pádů starých verzí; integrovat mapping soubory s Firebase Crashlytics prostřednictvím automatického nahrávání; pravidelně kontrolovat, že deobfuskace v konzoli Firebase správně obnovuje názvy tříd.

Testování s R8 full mode

Plný režim R8 může odstraňovat kód, který je ve standardním režimu považován za dosažitelný. Kritické oblasti pro testování: obrazovky s WebView (R8 může odstranit třídy bridge rozhraní), aplikace s pluginy přes classLoader, knihovny analytiky a crash reportingu a vlastní view v layout souborech vytvářené inflate.

Monitorování velikosti sestavení

Google doporučuje sledovat velikost APK po aplikaci R8 v každém sestavení. Použijte APK Analyzer v Android Studio pro porovnání velikosti jednotlivých komponent: classes.dex, resources.arsc a knihoven nativního kódu. R8 může ovlivňovat velikost DEX souborů nelineárně — někdy agresivní optimalizace vede ke zvýšení velikosti kvůli inliningu. Pravidelné monitorování pomáhá včas odhalit anomálie a upravit pravidla obfuskace.

kotlin
// Příklad třídy uchovávané pro Firebase Crashlytics
@Keep
class CrashLogger {
    fun logException(e: Throwable) {
        FirebaseCrashlytics.getInstance().recordException(e)
    }
}

// rules.pro — zachovat všechny třídy s @Keep
// -keep @androidx.annotation.Keep class * { *; }

Často kladené otázky

Je třeba instalovat R8 samostatně?

Ne, R8 je vestavěn v Android Gradle Plugin a instaluje se automaticky při aktualizaci AGP. Od AGP 8.0 je ProGuard z pluginu zcela odstraněn a R8 je jediným nástrojem. Pro AGP 7.x je R8 používán ve výchozím nastavení, ale ProGuard zůstává jako volba. Samostatná instalace R8 není nutná — stačí aktualizovat verzi AGP.

Proč je R8 rychlejší než ProGuard?

R8 je rychlejší díky třem faktorům: integrace do DEX kompilátoru odstraňuje dodatečný průchod bajtkódem, vícevláknová architektura efektivněji využívá vícejádrové procesory a chytřejší analýza dosažitelnosti snižuje objem zpracovávaného kódu. Podle testů Googlu na projektu střední velikosti provádí R8 zpracování za 12 sekund oproti 18 sekundám u ProGuardu.

Lze R8 vypnout a vrátit se k ProGuardu?

V AGP 7.x lze R8 vypnout pomocí gradle.properties: android.enableR8=false. V AGP 8.0+ není návrat k ProGuardu možný, protože plugin zcela přešel na R8. Pokud projekt kriticky závisí na specifickém chování ProGuardu, doporučuje se zafixovat AGP na verzi 7.4, kde jsou dostupné oba nástroje.

Jak R8 zpracovává Kotlin korutiny?

R8 správně zpracovává Kotlin korutiny díky vestavěné analýze Kotlin metadat. Nástroj rozumí sémantice suspend funkcí, Continuation objektů a generování StateMachine kompilátorem Kotlin. R8 neodstraňuje potřebné korutinové třídy a může je optimalizovat, pokud je to bezpečné. Pro projekty v Kotlinu se doporučuje fullMode pro maximální optimalizaci.

Jaké chyby se nejčastěji vyskytují při přechodu na R8?

Nejčastější problémy při migraci: Missing classes — R8 odstraňuje třídy, které ProGuard zachovával; Inlining issues — agresivní inlining narušuje reflexi; Library incompatibility — knihovny se starými pravidly ProGuard; Full mode crashes — dodatečné odstraňování kódu v fullMode. Řešení: testovat na fyzických zařízeních, používat -keep pro reflexi a kontrolovat stacktrace přes mapping soubor.

Shrnutí

  • R8 je nástupce ProGuardu integrovaný do DEX kompilátoru, který nahrazuje ProGuard od AGP 8.0.
  • Komprese kódu R8 je o 15 % efektivnější než ProGuard, zmenšuje APK dodatečně o 5–11 MB.
  • Rychlost sestavení s R8 je o 20–30 % vyšší díky vícevláknové architektuře.
  • Desugaring Java 8+ je vestavěn do R8, čímž odpadá nutnost dalších knihoven.
  • Full mode zapíná agresivní optimalizace pro maximální kompresi APK.
  • Kompatibilita pravidel ProGuardu s R8 zajišťuje transparentní migraci pro stávající projekty.
  • Mapping soubory R8 je nutné uchovávat a integrovat s Firebase Crashlytics.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také