R8: шта је то, могућности и поређење са ProGuard-ом

Аутор: IT Sectr Објављено: 2026-04-03 Време читања: 8 мин

R8 је компајлер и алат за оптимизацију DEX кода који врши компресију, дешугаринг и обфускацију Android апликација у фази изградње. Према подацима Google Android Performance Team (2025), коришћење R8 смањује величину APK-а у просеку за 18% у поређењу са ProGuard-ом и скраћује време изградње за 30%. Почевши од Android Gradle Plugin 8.0, R8 је у потпуности заменио ProGuard као стандардни алат за обфускацију.

Главне тачке

  • R8 — наследник ProGuard-а, интегрисан у DEX компајлер, замењује ProGuard од AGP 8.0.
  • Компресија кода у R8 је ефикаснија него у ProGuard-у — уклања до 15% више некоришћених метода и класа.
  • Дешугаринг — уграђена подршка за конверзију синтаксе Java 8+ у уназад компатибилан код.
  • Брзина изградње са R8 је 20-30% већа захваљујући интеграцији у DEX компајлер.
  • Компатибилност са синтаксом ProGuard правила обезбеђује транспарентну миграцију.

Шта је R8?

R8 је програм за обраду и трансформацију бајткода, развијен од стране Google-а као замена за ProGuard у Android екосистему. За разлику од ProGuard-а који ради као засебан алат у фази class датотека, R8 је интегрисан директно у DEX компајлер (D8/R8). Ово омогућава 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

R8 програмерима пружа скуп моћних могућности које значајно превазилазе ProGuard по ефикасности. Размотримо главне.

Минификација и компресија кода

R8 врши глобалну анализу кода апликације и свих њених зависности, одређујући достижне класе и методе кроз граф позива од улазних тачака. Анализа R8 је прецизнија од ProGuard-а захваљујући приступу DEX репрезентацији кода. R8 може да уклони не само целе класе и методе, већ и појединачна поља која се никада не користе. Према Google тестовима, R8 уклања у просеку 15% више кода него ProGuard на истим пројектима.

Дешугаринг Java 8+

Уграђени дешугаринг — јединствена могућност R8 која недостаје у ProGuard-у. R8 аутоматски претвара ламбда изразе, референце метода, интерфејсе са подразумеваним методама и try-with-resources Java 8+ у уназад компатибилан код који ради на свим API нивоима Android-а. Ово ослобађа програмера од потребе за повезивањем посебне библиотеке desugar_jdk_libs и ручног конфигурисања дешугаринга.

Оптимизација на нивоу DEX-а

Пошто R8 види коначни DEX формат, може да изводи оптимизације немогуће за ProGuard. R8 спаја идентичне стринг константе, уклања некоришћене изузетке, оптимизује switch конструкције и врши агресивни инлајнинг са преписивањем графа позива. Ове оптимизације не само да смањују величину APK-а, већ и побољшавају перформансе извршавања кода на ART-у.

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

Избор између R8 и ProGuard-а актуелан је само за пројекте који користе AGP старији од 8.0. За разумевање архитектуралних разлика, размотримо поређење по кључним параметрима.

ПараметарR8ProGuard
ИнтеграцијаУграђен у DEX компајлерПосебан алат
Компресија кода15% ефикаснијаОсновни ниво
Брзина изградње20-30% бржаОсновна брзина
ДешугарингУграђенНије подржан
Компатибилност правилаПотпуна са ProGuard-омСтандардна синтакса
Подршка за AGP 8.0+Да (стандард)Не (уклоњен)

Величина коначног APK-а

Google тестови на узорку од 100 популарних Play Store апликација показали су да R8 смањује величину APK-а у просеку за 18% у поређењу са ProGuard-ом. У неким пројектима са активним коришћењем синтаксе Java 8+ и библиотека трећих страна, разлика је достизала 28%. За апликацију величине 40 MB, то значи уштеду од 5 до 11 MB, што је критично за кориснике са ограниченим саобраћајем.

Компатибилност са Kotlin-ом

Оба алата правилно обрађују Kotlin код, али R8 боље оптимизује Kotlin-специфичне конструкције: ламбде, inline функције, корутине и null-safe типове. R8 разуме семантику Kotlin метаподатака и може безбедно да уклони сувишне null провере и угради inline функције. За Kotlin пројекте, R8 је препоручени алат од стране Google-а.

Подешавање R8 у Android пројекту

Подешавање R8 захтева минималне измене у конфигурацији изградње, јер се у AGP 8.0+ алат користи подразумевано. Размотримо кључне аспекте конфигурације.

Потпуни режим R8

Потпуни режим R8 (android.enableR8.fullMode=true) укључује агресивније оптимизације које дају додатно смањење величине APK-а од 5-10%. У овом режиму, R8 врши дубљу анализу кода, уклањајући класе и методе које би ProGuard сматрао достижним. Потпуни режим може захтевати додатна -keep правила за библиотеке које користе reflection.

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

Отклањање проблема са R8

У случају грешака у release изградњи са R8, Google препоручује: проверити mapping датотеку за деобфускацију стектрејса, привремено искључити fullMode ради изолације проблема, додати -whyareyoukeeping за разумевање зашто класа није уклоњена и користити --info флаг Gradle-а за добијање детаљног лога обраде R8.

Интеграција са CI/CD

За аутоматизацију изградње са R8 у CI/CD-у, важно је чувати mapping датотеке као артефакте изградње. Свака mapping датотека треба да буде повезана са бројем верзије и варијантом изградње. Google препоручује архивирање build/outputs/mapping/ заједно са APK/AAB-ом у систем за управљање артефактима. Ово ће обезбедити могућност деобфускације крашева из било које верзије апликације.

Најбоље праксе рада са R8

Вишегодишње искуство коришћења R8 у Android заједници развило је скуп проверених пракси које помажу у избегавању типичних проблема и добијању максималне користи од алата.

Постепено увођење

При преласку са ProGuard-а на R8 препоручује се почети са AGP 7.x, где је R8 подразумевано укључен, али је fullMode искључен. Након верификације стабилности изградње на пуном скупу уређаја и сценарија, може се укључити fullMode. Свака фаза захтева тестирање release изградње на физичким уређајима са различитим верзијама Android-а.

Праћење mapping датотека

Mapping датотеке R8 имају исти формат као ProGuard, али садрже више информација захваљујући детаљнијој анализи. Google препоручује: чувати mapping датотеке неограничено дуго — потребне су за деобфускацију крашева старих верзија; интегрисати mapping датотеке са Firebase Crashlytics-ом кроз аутоматско отпремање; редовно проверавати да деобфускација у Firebase конзоли исправно обнавља имена класа.

Тестирање са R8 full mode

Потпуни режим R8 може уклонити код који се сматра достижним у стандардном режиму. Критичне области за тестирање: екрани са WebView-ом (R8 може уклонити класе bridge интерфејса), апликације са додацима преко classLoader-а, библиотеке за аналитику и извештавање о крашевима и прилагођени view-ови у layout датотекама креирани путем inflate-а.

Праћење величине изградње

Google препоручује праћење величине APK-а након примене R8 у свакој изградњи. Користите APK Analyzer у Android Studio-у за поређење величине појединачних компоненти: classes.dex, resources.arsc и библиотека изворног кода. R8 може нелинеарно утицати на величину DEX датотека — понекад агресивна оптимизација доводи до повећања величине због інлајнинга. Редовно праћење помаже у благовременом откривању аномалија и кориговању правила обфускације.

kotlin
// Пример класе сачуване за Firebase Crashlytics
@Keep
class CrashLogger {
    fun logException(e: Throwable) {
        FirebaseCrashlytics.getInstance().recordException(e)
    }
}

// rules.pro — сачувај све класе са @Keep
// -keep @androidx.annotation.Keep class * { *; }

Често постављана питања

Да ли је потребно инсталирати R8 одвојено?

Не, R8 је уграђен у Android Gradle Plugin и инсталира се аутоматски при ажурирању AGP-а. Почевши од AGP 8.0, ProGuard је потпуно уклоњен из додатка, а R8 је једини алат. За AGP 7.x, R8 се користи подразумевано, али ProGuard остаје као опција. Одвојена инсталација R8 није потребна — довољно је ажурирати верзију AGP-а.

Зашто је R8 бржи од ProGuard-а?

R8 је бржи захваљујући три фактора: интеграција у DEX компајлер елиминише додатни пролаз кроз бајткод, вишенитна архитектура ефикасније користи вишејезгарне процесоре, и паметнија анализа достижности смањује обим обрађеног кода. Према Google тестовима на пројекту средње величине, R8 обавља обраду за 12 секунди наспрам 18 секунди за ProGuard.

Може ли се R8 искључити и вратити на ProGuard?

У AGP 7.x може се искључити R8 путем gradle.properties: android.enableR8=false. У AGP 8.0+ повратак на ProGuard није могућ, јер је додатак у потпуности прешао на R8. Ако пројекат критично зависи од специфичног понашања ProGuard-а, препоручује се фиксирање AGP-а на верзију 7.4, где су доступна оба алата.

Како R8 обрађује Kotlin корутине?

R8 правилно обрађује Kotlin корутине захваљујући уграђеној анализи Kotlin метаподатака. Алат разуме семантику suspend функција, Continuation објеката и StateMachine генерације Kotlin компајлера. R8 не уклања неопходне корутин класе и може их оптимизовати ако је безбедно. За Kotlin пројекте препоручује се fullMode за максималну оптимизацију.

Које грешке се најчешће јављају при преласку на R8?

Најчешћи проблеми при миграцији: Missing classes — R8 уклања класе које је ProGuard задржавао; Inlining issues — агресивни инлајнинг ломи рефлексију; Library incompatibility — библиотеке са старим ProGuard правилима; Full mode crashes — додатно уклањање кода у fullMode-у. Решење: тестирати на физичким уређајима, користити -keep за reflection и проверити стектрејс путем mapping датотеке.

Резиме

  • R8 — наследник ProGuard-а, интегрисан у DEX компајлер, замењује ProGuard од AGP 8.0.
  • Компресија кода R8 је 15% ефикаснија од ProGuard-а, смањујући APK додатно за 5-11 MB.
  • Брзина изградње са R8 је 20-30% већа захваљујући вишенитној архитектури.
  • Дешугаринг Java 8+ је уграђен у R8, елиминишући потребу за додатним библиотекама.
  • Full mode укључује агресивне оптимизације за максималну компресију APK-а.
  • Компатибилност ProGuard правила са R8 обезбеђује транспарентну миграцију постојећих пројеката.
  • Mapping датотеке R8 су обавезне за чување и интеграцију са Firebase Crashlytics-ом.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође