Site icon AppTractor

Что такое R8 в Android-разработке

Современные Android-приложения стремятся быть не только функциональными, но и быстрыми, безопасными, а главное — компактными. Размер APK или AAB-файла напрямую влияет на поведение пользователей: чем тяжелее приложение, тем реже его загружают, особенно в регионах с ограниченным интернетом. Кроме того, большой объем неиспользуемого кода усложняет сопровождение и увеличивает время сборки. Именно для решения этих задач Google внедрила в Android Gradle Plugin мощный инструмент — R8.

Зачем нужен R8?

R8 — это компилятор и оптимизатор кода, встроенный в цепочку сборки Android-приложения. Он объединяет в себе функции сразу нескольких инструментов: D8, ProGuard и Shrinker, обеспечивая минификацию, обфускацию, удаление неиспользуемого кода и преобразование Java- или Kotlin-байт-кода в формат DEX, необходимый для выполнения на Android-устройствах.

До появления R8 разработчики использовали отдельные инструменты:

R8 объединил все эти этапы в одну фазу, ускорил процесс сборки и улучшил результаты оптимизации.

Как работает R8

Когда вы собираете Android-приложение в release-режиме, R8 автоматически включается (начиная с Android Gradle Plugin 3.4.0). Он получает на вход байт-код Java/Kotlin и ProGuard-конфигурацию, а на выходе формирует уже оптимизированные DEX-файлы.

Основные этапы работы R8:

Преимущества R8

Внедрение R8 дало разработчикам сразу несколько ощутимых преимуществ:

Использование R8 на практике

В большинстве случаев R8 уже активирован по умолчанию, и ничего специально делать не нужно. Однако вы можете контролировать его поведение через Gradle и .pro-файлы.

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'),
                'proguard-rules.pro'
        }
    }
}

Флаг minifyEnabled true включает R8. При этом, если используется Android Gradle Plugin 3.4.0+, то именно R8, а не ProGuard, будет применяться по умолчанию.

Настройка через proguard-rules.pro

Файл конфигурации позволяет задавать, какие классы, методы и поля должны быть исключены из минификации и обфускации. Это полезно для библиотек, которые используют рефлексию или требуются для сериализации (например, Gson, Moshi, Jackson).

Примеры правил:

# Сохраняем все модели с аннотацией @Keep
-keep @androidx.annotation.Keep class * { *; }

# Не обфусцировать классы Gson
-keep class com.example.models.** { *; }

# Сохраняем публичные методы API
-keepclassmembers class com.example.api.** {
    public *;
}

R8 против ProGuard: в чём разница?

Хотя R8 совместим с ProGuard и использует те же правила, между ними есть существенные различия:

Характеристика R8 ProGuard
Поддержка DEX-компиляции Да (заменяет D8) Нет
Скорость работы Быстрее Медленнее
Интеграция в Gradle По умолчанию в AGP 3.4+ Нужно отдельно подключать
Расширенные оптимизации Да Нет
Поддержка Kotlin Полная Частичная
Использование ресурсов Эффективнее Менее эффективно

Таким образом, R8 является современной, более быстрой и умной заменой ProGuard.

Особенности и подводные камни

Несмотря на свои достоинства, R8 требует внимательности. Некоторые особенности стоит учесть:

Вывод

R8 — это мощный и гибкий инструмент оптимизации, который существенно улучшает процесс сборки Android-приложений. Он уменьшает размер, ускоряет выполнение, затрудняет реверс-инжиниринг и делает процесс сборки более эффективным. Благодаря полной интеграции в Android Gradle Plugin и поддержке существующих ProGuard-правил, переход на R8 не требует серьёзных усилий и даёт мгновенные выгоды.

Используя R8 грамотно — с учётом особенностей проекта, правил сериализации и рефлексии — вы сможете сделать своё приложение быстрее, компактнее и безопаснее, не жертвуя при этом функциональностью.

Exit mobile version