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 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.
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í.
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.
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í.
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.
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.
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.
// 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
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ů.
| Parametr | R8 | ProGuard |
|---|---|---|
| Integrace | Vestavěn v DEX kompilátoru | Samostatný nástroj |
| Komprese kódu | O 15 % efektivnější | Základní úroveň |
| Rychlost sestavení | O 20–30 % rychlejší | Základní rychlost |
| Desugaring | Vestavěný | Nepodporován |
| Kompatibilita pravidel | Plná s ProGuardem | Standardní syntaxe |
| Podpora AGP 8.0+ | Ano (standard) | Ne (odstraněn) |
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.
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 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.
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.
# 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 *;
}
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.
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.
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.
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.
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.
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.
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.
// 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
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.
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.
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.
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.
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í
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í.
Přečtěte si také