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 различных типов преобразований — от простых (инлайнинг констант) до сложных (анализ достигаемости типов с точностью до отдельного поля). По данным 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 автоматически преобразует лямбда-выражения, method references, интерфейсы с default-методами и try-with-resources Java 8+ в обратно совместимый код, работающий на всех API уровнях Android. Это избавляет разработчика от необходимости подключать отдельную библиотеку desugar_jdk_libs и вручную конфигурировать дешугаринг.

Оптимизация на уровне DEX

Поскольку R8 видит конечный DEX-формат, он может выполнять оптимизации, невозможные для ProGuard. R8 объединяет одинаковые строковые константы, удаляет неиспользуемые исключения, оптимизирует switch-конструкции и выполняет aggressive-инлайнинг с переписыванием графа вызовов. Эти оптимизации не только уменьшают размер 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 full mode (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

При возникновении ошибок в релизной сборке с 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. Каждый этап требует тестирования релизной сборки на физических устройствах с разными версиями Android.

Мониторинг mapping-файлов

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

Тестирование с R8 full mode

Полный режим R8 может удалять код, который считается достижимым в стандартном режиме. Критические области для тестирования: экраны с WebView (R8 может удалить классы bridge-интерфейсов), приложения с плагинами через classLoader, библиотеки аналитики и crash-репортинга и кастомные view в layout-файлах, создаваемые inflate.

Мониторинг размера сборки

Google рекомендует отслеживать размер APK после применения R8 в каждой сборке. Используйте APK Analyzer в Android Studio для сравнения размера отдельных компонентов: classes.dex, resources.arsc и библиотек native-кода. R8 может влиять на размер DEX-файлов нелинейно — иногда aggressive-оптимизация приводит к увеличению размера за счёт инлайнинга. Регулярный мониторинг помогает своевременно обнаруживать аномалии и корректировать правила обфускации.

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 — aggressive-инлайнинг ломает рефлексию; Library incompatibility — библиотеки со старыми правилами ProGuard; Full mode crashes — дополнительное удаление кода в fullMode. Решение: тестировать на физических устройствах, использовать -keep для reflection и проверять stacktrace через 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также