R8 је компајлер и алат за оптимизацију DEX кода који врши компресију, дешугаринг и обфускацију Android апликација у фази изградње. Према подацима Google Android Performance Team (2025), коришћење R8 смањује величину APK-а у просеку за 18% у поређењу са ProGuard-ом и скраћује време изградње за 30%. Почевши од Android Gradle Plugin 8.0, R8 је у потпуности заменио ProGuard као стандардни алат за обфускацију.
Главне тачке
R8 је програм за обраду и трансформацију бајткода, развијен од стране Google-а као замена за ProGuard у Android екосистему. За разлику од ProGuard-а који ради као засебан алат у фази class датотека, R8 је интегрисан директно у DEX компајлер (D8/R8). Ово омогућава R8 да врши анализу и оптимизацију на дубљем нивоу, недоступном за спољне алате.
R8 на улазу прима Java бајткод у формату class датотека или JAR архива и претвара га у оптимизовани DEX код у једном пролазу. Уграђени оптимизатор R8 изводи преко 50 различитих типова трансформација — од једноставних (inline константи) до сложених (анализа достижности типова са прецизношћу до појединачног поља). Према Google-у, архитектура R8 је посебно дизајнирана за рад у вишенитном режиму, што обезбеђује високу брзину изградње.
R8 је најављен на Google I/O 2018 и први пут укључен у Android Gradle Plugin 3.4 (2019) као опциона замена за ProGuard. У AGP 7.0, R8 је постао подразумевани алат за све пројекте, а у AGP 8.0 (2023) подршка за ProGuard је потпуно уклоњена из додатка. Од 2025. године, R8 је једини званични алат за обфускацију и оптимизацију за Android који препоручује Google.
R8 програмерима пружа скуп моћних могућности које значајно превазилазе ProGuard по ефикасности. Размотримо главне.
R8 врши глобалну анализу кода апликације и свих њених зависности, одређујући достижне класе и методе кроз граф позива од улазних тачака. Анализа R8 је прецизнија од ProGuard-а захваљујући приступу DEX репрезентацији кода. R8 може да уклони не само целе класе и методе, већ и појединачна поља која се никада не користе. Према Google тестовима, R8 уклања у просеку 15% више кода него ProGuard на истим пројектима.
Уграђени дешугаринг — јединствена могућност R8 која недостаје у ProGuard-у. R8 аутоматски претвара ламбда изразе, референце метода, интерфејсе са подразумеваним методама и try-with-resources Java 8+ у уназад компатибилан код који ради на свим API нивоима Android-а. Ово ослобађа програмера од потребе за повезивањем посебне библиотеке desugar_jdk_libs и ручног конфигурисања дешугаринга.
Пошто R8 види коначни DEX формат, може да изводи оптимизације немогуће за ProGuard. R8 спаја идентичне стринг константе, уклања некоришћене изузетке, оптимизује switch конструкције и врши агресивни инлајнинг са преписивањем графа позива. Ове оптимизације не само да смањују величину APK-а, већ и побољшавају перформансе извршавања кода на ART-у.
// build.gradle експлицитно укључивање R8 (опционо у AGP 8.0+)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — принудно укључивање R8
android.enableR8.fullMode=true
Избор између R8 и ProGuard-а актуелан је само за пројекте који користе AGP старији од 8.0. За разумевање архитектуралних разлика, размотримо поређење по кључним параметрима.
| Параметар | R8 | ProGuard |
|---|---|---|
| Интеграција | Уграђен у DEX компајлер | Посебан алат |
| Компресија кода | 15% ефикаснија | Основни ниво |
| Брзина изградње | 20-30% бржа | Основна брзина |
| Дешугаринг | Уграђен | Није подржан |
| Компатибилност правила | Потпуна са ProGuard-ом | Стандардна синтакса |
| Подршка за AGP 8.0+ | Да (стандард) | Не (уклоњен) |
Google тестови на узорку од 100 популарних Play Store апликација показали су да R8 смањује величину APK-а у просеку за 18% у поређењу са ProGuard-ом. У неким пројектима са активним коришћењем синтаксе Java 8+ и библиотека трећих страна, разлика је достизала 28%. За апликацију величине 40 MB, то значи уштеду од 5 до 11 MB, што је критично за кориснике са ограниченим саобраћајем.
Оба алата правилно обрађују Kotlin код, али R8 боље оптимизује Kotlin-специфичне конструкције: ламбде, inline функције, корутине и null-safe типове. R8 разуме семантику Kotlin метаподатака и може безбедно да уклони сувишне null провере и угради inline функције. За Kotlin пројекте, R8 је препоручени алат од стране Google-а.
Подешавање R8 захтева минималне измене у конфигурацији изградње, јер се у AGP 8.0+ алат користи подразумевано. Размотримо кључне аспекте конфигурације.
Потпуни режим R8 (android.enableR8.fullMode=true) укључује агресивније оптимизације које дају додатно смањење величине APK-а од 5-10%. У овом режиму, R8 врши дубљу анализу кода, уклањајући класе и методе које би ProGuard сматрао достижним. Потпуни режим може захтевати додатна -keep правила за библиотеке које користе reflection.
# gradle.properties — укључивање пуног режима R8
android.enableR8.fullMode=true
# Додатна правила за full mode
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
У случају грешака у release изградњи са R8, Google препоручује: проверити mapping датотеку за деобфускацију стектрејса, привремено искључити fullMode ради изолације проблема, додати -whyareyoukeeping за разумевање зашто класа није уклоњена и користити --info флаг Gradle-а за добијање детаљног лога обраде R8.
За аутоматизацију изградње са R8 у CI/CD-у, важно је чувати mapping датотеке као артефакте изградње. Свака mapping датотека треба да буде повезана са бројем верзије и варијантом изградње. Google препоручује архивирање build/outputs/mapping/ заједно са APK/AAB-ом у систем за управљање артефактима. Ово ће обезбедити могућност деобфускације крашева из било које верзије апликације.
Вишегодишње искуство коришћења R8 у Android заједници развило је скуп проверених пракси које помажу у избегавању типичних проблема и добијању максималне користи од алата.
При преласку са ProGuard-а на R8 препоручује се почети са AGP 7.x, где је R8 подразумевано укључен, али је fullMode искључен. Након верификације стабилности изградње на пуном скупу уређаја и сценарија, може се укључити fullMode. Свака фаза захтева тестирање release изградње на физичким уређајима са различитим верзијама Android-а.
Mapping датотеке R8 имају исти формат као ProGuard, али садрже више информација захваљујући детаљнијој анализи. Google препоручује: чувати mapping датотеке неограничено дуго — потребне су за деобфускацију крашева старих верзија; интегрисати mapping датотеке са Firebase Crashlytics-ом кроз аутоматско отпремање; редовно проверавати да деобфускација у Firebase конзоли исправно обнавља имена класа.
Потпуни режим R8 може уклонити код који се сматра достижним у стандардном режиму. Критичне области за тестирање: екрани са WebView-ом (R8 може уклонити класе bridge интерфејса), апликације са додацима преко classLoader-а, библиотеке за аналитику и извештавање о крашевима и прилагођени view-ови у layout датотекама креирани путем inflate-а.
Google препоручује праћење величине APK-а након примене R8 у свакој изградњи. Користите APK Analyzer у Android Studio-у за поређење величине појединачних компоненти: classes.dex, resources.arsc и библиотека изворног кода. R8 може нелинеарно утицати на величину DEX датотека — понекад агресивна оптимизација доводи до повећања величине због інлајнинга. Редовно праћење помаже у благовременом откривању аномалија и кориговању правила обфускације.
// Пример класе сачуване за Firebase Crashlytics
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — сачувај све класе са @Keep
// -keep @androidx.annotation.Keep class * { *; }
Често постављана питања
Не, R8 је уграђен у Android Gradle Plugin и инсталира се аутоматски при ажурирању AGP-а. Почевши од AGP 8.0, ProGuard је потпуно уклоњен из додатка, а R8 је једини алат. За AGP 7.x, R8 се користи подразумевано, али ProGuard остаје као опција. Одвојена инсталација R8 није потребна — довољно је ажурирати верзију AGP-а.
R8 је бржи захваљујући три фактора: интеграција у DEX компајлер елиминише додатни пролаз кроз бајткод, вишенитна архитектура ефикасније користи вишејезгарне процесоре, и паметнија анализа достижности смањује обим обрађеног кода. Према Google тестовима на пројекту средње величине, R8 обавља обраду за 12 секунди наспрам 18 секунди за ProGuard.
У AGP 7.x може се искључити R8 путем gradle.properties: android.enableR8=false. У AGP 8.0+ повратак на ProGuard није могућ, јер је додатак у потпуности прешао на R8. Ако пројекат критично зависи од специфичног понашања ProGuard-а, препоручује се фиксирање AGP-а на верзију 7.4, где су доступна оба алата.
R8 правилно обрађује Kotlin корутине захваљујући уграђеној анализи Kotlin метаподатака. Алат разуме семантику suspend функција, Continuation објеката и StateMachine генерације Kotlin компајлера. R8 не уклања неопходне корутин класе и може их оптимизовати ако је безбедно. За Kotlin пројекте препоручује се fullMode за максималну оптимизацију.
Најчешћи проблеми при миграцији: Missing classes — R8 уклања класе које је ProGuard задржавао; Inlining issues — агресивни инлајнинг ломи рефлексију; Library incompatibility — библиотеке са старим ProGuard правилима; Full mode crashes — додатно уклањање кода у fullMode-у. Решење: тестирати на физичким уређајима, користити -keep за reflection и проверити стектрејс путем mapping датотеке.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође