Az R8 egy DEX-kód optimalizálására szolgáló fordító és eszköz, amely tömörítést, desugaringot és obfuszkációt végez az Android alkalmazások build fázisában. A Google Android Performance Team (2025) adatai szerint az R8 használata átlagosan 18%-kal csökkenti az APK méretét a ProGuard-hoz képest, és 30%-kal rövidíti a build időt. Az Android Gradle Plugin 8.0-tól kezdve az R8 teljesen felváltotta a ProGuard-ot szabványos obfuszkációs eszközként.
Főbb pontok
R8 egy bytecode feldolgozó és átalakító program, amelyet a Google fejlesztett ki a ProGuard helyettesítésére az Android ökoszisztémában. Ellentétben a ProGuard-dal, amely külön eszközként működik a class fájlok fázisában, az R8 közvetlenül a DEX fordítóba (D8/R8) van integrálva. Ez lehetővé teszi az R8 számára, hogy mélyebb szintű elemzést és optimalizálást végezzen, amely külső eszközök számára nem elérhető.
R8 bemenetként Java bytecode-ot kap class fájlok vagy JAR archívumok formájában, és egyetlen menetben optimalizált DEX kóddá alakítja. A beépített R8 optimalizáló több mint 50 különböző típusú átalakítást végez — az egyszerűtől (konstansok inline) a bonyolultig (típusok elérhetőségének elemzése egyedi mező pontossággal). A Google szerint az R8 architektúrája kifejezetten többszálú üzemmódra lett tervezve, ami magas build sebességet biztosít.
R8 a Google I/O 2018-ban jelentették be, és először az Android Gradle Plugin 3.4-be (2019) került be, mint opcionális ProGuard helyettesítő. Az AGP 7.0-ban az R8 az összes projekt alapértelmezett eszközévé vált, az AGP 8.0-ban (2023) pedig a ProGuard támogatás teljesen eltávolításra került a pluginból. 2025-től az R8 az egyetlen hivatalos obfuszkációs és optimalizáló eszköz Androidhoz, amelyet a Google ajánl.
R8 a fejlesztők számára olyan hatékony képességeket biztosít, amelyek jelentősen felülmúlják a ProGuard-ot a hatékonyság terén. Tekintsük át a főbbeket.
R8 globális elemzést végez az alkalmazás és összes függőségének kódján, meghatározva az elérhető osztályokat és metódusokat a belépési pontoktól számított hívásgráfon keresztül. Az R8 elemzése pontosabb, mint a ProGuard-é, köszönhetően a DEX kódreprezentációhoz való hozzáférésnek. Az R8 nemcsak teljes osztályokat és metódusokat, hanem egyedi mezőket is eltávolíthat, amelyek soha nem kerülnek használatra. A Google tesztjei szerint az R8 átlagosan 15%-kal több kódot távolít el, mint a ProGuard ugyanazokon a projekteken.
Beépített desugaring — az R8 egyedülálló képessége, amely hiányzik a ProGuard-ból. Az R8 automatikusan konvertálja a lambda kifejezéseket, metódus referenciákat, alapértelmezett metódusokkal rendelkező interfészeket és a Java 8+ try-with-resources szerkezeteket visszafelé kompatibilis kóddá, amely az Android összes API szintjén működik. Ez mentesíti a fejlesztőt a külön desugar_jdk_libs könyvtár csatlakoztatásának és a desugaring manuális konfigurálásának szükségességétől.
Mivel az R8 látja a végső DEX formátumot, olyan optimalizálásokat végezhet, amelyek a ProGuard számára lehetetlenek. Az R8 összevonja az azonos string konstansokat, eltávolítja a nem használt kivételeket, optimalizálja a switch szerkezeteket, és agresszív inliningot végez a hívásgráf újraírásával. Ezek az optimalizálások nemcsak csökkentik az APK méretét, hanem javítják a kód végrehajtásának teljesítményét ART-on.
// build.gradle az R8 kifejezett engedélyezése (opcionális AGP 8.0+-ban)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — az R8 kényszerített engedélyezése
android.enableR8.fullMode=true
A választás az R8 és a ProGuard között csak a 8.0-nál régebbi AGP-t használó projekteknél releváns. Az architekturális különbségek megértéséhez nézzük meg az összehasonlítást a kulcsfontosságú paraméterek alapján.
| Paraméter | R8 | ProGuard |
|---|---|---|
| Integráció | Beépítve a DEX fordítóba | Külön eszköz |
| Kód tömörítés | 15%-kal hatékonyabb | Alap szint |
| Build sebesség | 20-30%-kal gyorsabb | Alap sebesség |
| Desugaring | Beépített | Nem támogatott |
| Szabály kompatibilitás | Teljes a ProGuard-dal | Szabványos szintaxis |
| AGP 8.0+ támogatás | Igen (szabvány) | Nem (eltávolítva) |
A Google 100 népszerű Play Store alkalmazás mintáján végzett tesztjei kimutatták, hogy az R8 átlagosan 18%-kal csökkenti az APK méretét a ProGuard-hoz képest. Néhány, a Java 8+ szintaxist és harmadik féltől származó könyvtárakat aktívan használó projektnél a különbség elérte a 28%-ot. Egy 40 MB méretű alkalmazásnál ez 5-11 MB megtakarítást jelent, ami kritikus a korlátozott adatforgalommal rendelkező felhasználók számára.
Mindkét eszköz helyesen dolgozza fel a Kotlin kódot, de az R8 jobban optimalizálja a Kotlin-specifikus szerkezeteket: lambda kifejezéseket, inline függvényeket, korutinokat és null-safe típusokat. Az R8 érti a Kotlin metaadatok szemantikáját, és biztonságosan eltávolíthatja a felesleges null ellenőrzéseket, valamint beágyazhatja az inline függvényeket. Kotlin projektekhez az R8 a Google által ajánlott eszköz.
Az R8 beállítása minimális változtatást igényel a build konfigurációban, mivel az AGP 8.0+-ban az eszköz alapértelmezés szerint használatos. Tekintsük át a konfiguráció kulcsfontosságú aspektusait.
R8 teljes mód (android.enableR8.fullMode=true) agresszívebb optimalizálásokat aktivál, amelyek további 5-10%-os APK méretcsökkenést eredményeznek. Ebben a módban az R8 mélyebb kódelemzést végez, eltávolítva azokat az osztályokat és metódusokat, amelyeket a ProGuard elérhetőnek tekintene. A teljes mód további -keep szabályokat igényelhet a reflection-t használó könyvtárak számára.
# gradle.properties — az R8 teljes módjának engedélyezése
android.enableR8.fullMode=true
# További szabályok a full mode-hoz
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
Ha hibák lépnek fel a release build során az R8-cal, a Google a következőket ajánlja: ellenőrizze a mapping fájlt a stacktrace deobfuszkálásához, ideiglenesen kapcsolja ki a fullMode-ot a probléma elkülönítéséhez, adja hozzá a -whyareyoukeeping opciót annak megértéséhez, miért nem lett eltávolítva egy osztály, és használja a Gradle --info flagjét az R8 feldolgozás részletes naplójának lekéréséhez.
A build automatizálásához R8-cal CI/CD környezetben fontos a mapping fájlok build artefaktumként történő megőrzése. Minden mapping fájlt hozzá kell rendelni a verziószámhoz és a build variánshoz. A Google a build/outputs/mapping/ APK/AAB-vel együtt történő archiválását ajánlja egy artefaktumkezelő rendszerben. Ez biztosítja a crash-ek deobfuszkálásának lehetőségét az alkalmazás bármely verziójából.
Az R8 Android közösségben szerzett többéves használati tapasztalata olyan bevált gyakorlatokat alakított ki, amelyek segítenek elkerülni a tipikus problémákat és maximalizálni az eszközből származó előnyöket.
A ProGuard-ról R8-ra való áttéréskor ajánlott AGP 7.x-szel kezdeni, ahol az R8 alapértelmezetten be van kapcsolva, de a fullMode ki van kapcsolva. Miután a build stabilitása ellenőrzésre került a teljes eszköz- és forgatókönyv-készleten, a fullMode bekapcsolható. Minden szakaszhoz szükség van a release build tesztelésére fizikai eszközökön különböző Android verziókkal.
Az R8 mapping fájlok formátuma megegyezik a ProGuard-éval, de több információt tartalmaznak a részletesebb elemzésnek köszönhetően. A Google a következőket ajánlja: a mapping fájlokat korlátlan ideig tárolja — szükségesek a régi verziók crash-jeinek deobfuszkálásához; integrálja a mapping fájlokat a Firebase Crashlytics-szel automatikus feltöltés segítségével; rendszeresen ellenőrizze, hogy a Firebase konzolban a deobfuszkálás helyesen állítja-e vissza az osztályneveket.
Az R8 teljes módja eltávolíthat olyan kódot, amely a szabványos módban elérhetőnek minősül. Kritikus területek a teszteléshez: WebView-t tartalmazó képernyők (az R8 eltávolíthatja a bridge interfész osztályokat), classLoader-en keresztül pluginokat használó alkalmazások, analitikai és crash reporting könyvtárak, valamint inflate segítségével létrehozott egyéni nézetek layout fájlokban.
A Google az APK méretének nyomon követését ajánlja az R8 alkalmazása után minden buildben. Használja az APK Analyzert az Android Studio-ban az egyes komponensek méretének összehasonlításához: classes.dex, resources.arsc és natív kód könyvtárak. Az R8 nemlineárisan befolyásolhatja a DEX fájlok méretét — néha az agresszív optimalizálás az inlining miatt méretnövekedéshez vezet. A rendszeres monitorozás segít időben észlelni az anomáliákat és módosítani az obfuszkációs szabályokat.
// Példa a Firebase Crashlytics számára megőrzött osztályra
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — az összes @Keep osztály megőrzése
// -keep @androidx.annotation.Keep class * { *; }
Gyakran ismételt kérdések
Nem, az R8 be van építve az Android Gradle Plugin-ba, és automatikusan települ az AGP frissítésekor. AGP 8.0-tól kezdve a ProGuard teljesen eltávolításra került a pluginból, és az R8 az egyetlen eszköz. AGP 7.x esetén az R8 alapértelmezett, de a ProGuard opcióként megmarad. Az R8 külön telepítése nem szükséges — elég az AGP verziót frissíteni.
R8 három tényezőnek köszönhetően gyorsabb: a DEX fordítóba való integráció kiküszöböli a bytecode-on való további áthaladást, a többszálú architektúra hatékonyabban használja a többmagos processzorokat, és az intelligensebb elérhetőségi elemzés csökkenti a feldolgozandó kód mennyiségét. A Google közepes méretű projekten végzett tesztjei szerint az R8 12 másodperc alatt végzi el a feldolgozást, szemben a ProGuard 18 másodpercével.
AGP 7.x-ben az R8 kikapcsolható a gradle.properties segítségével: android.enableR8=false. AGP 8.0+-ban a ProGuard-ra való visszatérés nem lehetséges, mivel a plugin teljesen átállt az R8-ra. Ha egy projekt kritikusan függ a ProGuard specifikus viselkedésétől, ajánlott az AGP-t a 7.4-es verzióban rögzíteni, ahol mindkét eszköz elérhető.
R8 a Kotlin metaadatok beépített elemzésének köszönhetően helyesen dolgozza fel a Kotlin korutinokat. Az eszköz érti a suspend függvények, a Continuation objektumok és a Kotlin fordító StateMachine generálásának szemantikáját. Az R8 nem távolítja el a szükséges korutin osztályokat, és ha biztonságos, optimalizálhatja azokat. Kotlin projektekhez a fullMode ajánlott a maximális optimalizálás érdekében.
A migráció során leggyakoribb problémák: Missing classes — az R8 eltávolítja azokat az osztályokat, amelyeket a ProGuard megtartott; Inlining issues — az agresszív inlining tönkreteszi a reflekciót; Library incompatibility — régi ProGuard szabályokkal rendelkező könyvtárak; Full mode crashes — további kódeliminálás fullMode-ban. Megoldás: fizikai eszközökön tesztelni, -keep használata reflectionhöz, és a stacktrace ellenőrzése a mapping fájlon keresztül.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is