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 різних типів перетворень — від простих (інлайнінг констант) до складних (аналіз досяжності типів з точністю до окремого поля). За даними 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 автоматично перетворює лямбда-вирази, method references, інтерфейси з default-методами та try-with-resources Java 8+ у зворотно сумісний код, що працює на всіх рівнях API Android. Це позбавляє розробника необхідності підключати окрему бібліотеку desugar_jdk_libs та вручну конфігурувати дешугаринг.
Оскільки R8 бачить кінцевий DEX-формат, він може виконувати оптимізації, неможливі для ProGuard. R8 об'єднує однакові рядкові константи, видаляє невикористовувані винятки, оптимізує switch-конструкції та виконує aggressive-інлайнінг з переписуванням графа викликів. Ці оптимізації не лише зменшують розмір 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-безпечні типи. R8 розуміє семантику Kotlin-метаданих і може безпечно видаляти зайві null-перевірки та вбудовувати inline-функції. Для проєктів на Kotlin R8 є рекомендованим інструментом Google.
Налаштування R8 потребує мінімальних змін у конфігурації збірки, оскільки в AGP 8.0+ інструмент використовується за замовчуванням. Розглянемо ключові аспекти конфігурації.
R8 full mode (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 *;
}
При виникненні помилок у релізній збірці з 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. Кожен етап потребує тестування релізної збірки на фізичних пристроях з різними версіями Android.
Mapping-файли R8 мають той самий формат, що й ProGuard, але містять більше інформації завдяки детальнішому аналізу. Google рекомендує: зберігати mapping-файли необмежено довго — вони потрібні для деобфускації крашів старих версій; інтегрувати mapping-файли з Firebase Crashlytics через автоматичне завантаження; регулярно перевіряти, що деобфускація в консолі Firebase коректно відновлює імена класів.
Повний режим R8 може видаляти код, який вважається досяжним у стандартному режимі. Критичні області для тестування: екрани з WebView (R8 може видалити класи bridge-інтерфейсів), застосунки з плагінами через classLoader, бібліотеки аналітики та crash-репортингу і кастомні view в layout-файлах, створювані inflate.
Google рекомендує відстежувати розмір APK після застосування R8 у кожній збірці. Використовуйте APK Analyzer в Android Studio для порівняння розміру окремих компонентів: classes.dex, resources.arsc та бібліотек native-коду. R8 може впливати на розмір DEX-файлів нелінійно — іноді aggressive-оптимізація призводить до збільшення розміру за рахунок інлайнінгу. Регулярний моніторинг допомагає своєчасно виявляти аномалії та коригувати правила обфускації.
// Приклад класу, що зберігається для 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 — aggressive-інлайнінг ламає рефлексію; Library incompatibility — бібліотеки зі старими правилами ProGuard; Full mode crashes — додаткове видалення коду в fullMode. Рішення: тестувати на фізичних пристроях, використовувати -keep для reflection та перевіряти stacktrace через mapping-файл.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також