← Назад к вопросам

Что такое ProGuard/R8? Для чего используется и как настроить?

2.2 Middle🔥 121 комментариев
#JVM и память#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое ProGuard и R8?

ProGuard — это инструмент для обфускации, оптимизации и минификации Java/Android-приложений, разработанный компанией GuardSquare. Он анализирует байт-код, удаляет неиспользуемые классы, поля, методы и атрибуты, сокращает имена оставшихся элементов (делая их нечитаемыми, например, a, b, c), а также выполняет оптимизации для уменьшения размера APK и повышения производительности.

R8 — это современный инструмент от Google, который объединяет функции процессора ресурсов, обфускатора (ProGuard), дешротлера (D8) и компилятора в один шаг. Он был представлен в Android Gradle Plugin 3.4.0 как замена ProGuard для конвейера сборки Android. R8 выполняет те же задачи, что и ProGuard, но работает быстрее и создаёт более эффективный код благодаря интеграции в пайплайн компиляции Android.


Для чего используется?

Основные цели применения ProGuard/R8:

  1. Уменьшение размера приложения (Minification): Удаление неиспользуемого кода и ресурсов. Это критично для экономии места на устройствах пользователей и снижения затрат на трафик при загрузке.
  2. Обфускация кода (Obfuscation): Переименование классов, методов и полей в короткие, бессмысленные имена. Это защищает исходный код от обратной инженерии и затрудняет анализ логики приложения злоумышленниками.
  3. Оптимизация производительности (Optimization): Применение различных техник, таких как удаление мёртвого кода, встраивание методов, оптимизация логических выражений и т.д., что может привести к увеличению скорости выполнения.
  4. Объединение (Shrinking): Часть процесса минификации, которая удаляет неиспользуемые классы и члены из конечного DEX-файла.

Важный нюанс: При использовании рефлексии (например, Class.forName("MyClass")) или динамической загрузки классов, инструмент может не распознать такие вызовы и удалить "неиспользуемые" классы. Это требует правильной настройки правил.


Как настроить ProGuard/R8?

Настройка осуществляется через правила (rules), которые пишутся в специальных файлах. Основные файлы:

  • proguard-rules.pro — пользовательский файл правил, расположенный в модуле app/.
  • proguard-android.txt / proguard-android-optimize.txt — базовые правила, предоставляемые Android SDK (оптимизированная версия более агрессивна).

Базовая настройка в build.gradle (модуль app)

android {
    buildTypes {
        release {
            // Включаем обфускацию и минификацию для релизной сборки
            minifyEnabled true
            // Включаем оптимизацию ресурсов (удаление неиспользуемых)
            shrinkResources true
            // Указываем файл с правилами ProGuard/R8
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }
        // Для debug-сборки обычно отключают для удобства отладки
        debug {
            minifyEnabled false
        }
    }
}

Примеры правил в файле app/proguard-rules.pro

1. Сохранение классов, используемых через рефлексию или сериализацию:

# Сохранить класс и его публичный конструктор при сериализации
-keepclassmembers class com.example.model.SerializableModel {
    public <init>();
}

# Сохранить весь класс и его члены, если он используется в GSON/Jackson
-keep class com.example.api.** { *; }

# Более точное правило для GSON
-keep class com.example.model.** { <fields>; }

2. Сохранение нативных методов:

-keepclasseswithmembernames class * {
    native <methods>;
}

3. Сохранение компонентов Android (Activity, Service и т.д.), если они объявлены в манифесте:

Обычно это делается автоматически, но для кастомных View или классов, не найденных в манифесте, может понадобиться:

-keep public class * extends android.app.Activity
-keep public class * extends android.view.View

4. Исключение из оптимизации (для библиотек или проблемных классов):

# Отключить оптимизацию для конкретной библиотеки
-dontoptimize class com.some.library.**
# Отключить предупреждения для библиотеки
-dontwarn com.some.library.**

5. Сохранение аннотаций (важно для некоторых библиотек, например, Room):

-keep class * extends java.lang.annotation.Annotation { *; }

Отладка и анализ результатов

  1. Файлы отображения (mapping): После сборки релизной версии в папке app/build/outputs/mapping/release/ создаются ключевые файлы:
    *   `mapping.txt` — сопоставление оригинальных имён классов, методов и полей с обфусцированными. **Крайне важен** для деобфускации стектрейсов сбоев.
    *   `seeds.txt` — перечень классов и членов, которые были оставлены (не удалены).
    *   `usage.txt` — перечень того, что было удалено.

  1. Деобфускация стектрейса: С помощью утилиты retrace (идет в составе Android SDK):
    retrace.bat mapping.txt stacktrace.txt
    

Современный подход с R8

Начиная с AGP 7.0, R8 является инструментом по умолчанию и имеет собственный, более полный набор правил. Многие библиотеки (например, от Google) теперь поставляют свои правила в формате R8, автоматически подключаемые через файлы .pro в AAR-архивах. Однако пользовательские правила по-прежнему пишутся в proguard-rules.pro.

Важно: Всегда тщательно тестируйте релизную сборку после настройки правил, особенно функциональность, связанную с отражением, динамической загрузкой классов, JNI и работой с сторонними библиотеками.

Что такое ProGuard/R8? Для чего используется и как настроить? | PrepBro