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-safe типы. 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также