Настройка ProGuard и R8 для обфускации Android-приложений

После включения `isMinifyEnabled = true` в release-сборке ваше Android-приложение может упасть с `ClassNotFoundException` или начать неожиданно возвращать null. Или приложение собирается, но Crashlytics показывает краши с непонятным стектрейсом. Это штатная ситуация: **R8** — компилятор, который одн

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Настройка ProGuard и R8 для обфускации Android-приложений
Средний
от 1 дня до 3 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

После включения isMinifyEnabled = true в release-сборке ваше Android-приложение может упасть с ClassNotFoundException или начать неожиданно возвращать null. Или приложение собирается, но Crashlytics показывает краши с непонятным стектрейсом. Это штатная ситуация: R8 — компилятор, который одновременно удаляет мёртвый код (tree shaking), переименовывает классы и методы (обфускация), а также оптимизирует байткод. Если не настроить keep-правила, приложение соберётся, но в рантайме поломается. У нас за плечами 5+ лет настройки обфускации для десятков проектов, и мы гарантируем стабильную работу release-сборки.

Как R8 минифицирует и обфусцирует код

R8 (ранее ProGuard) включён в Android Gradle Plugin начиная с версии 3.4. Он выполняет три ключевые задачи: tree shaking (удаление неиспользуемых классов, методов и полей), обфускация (переименование в короткие идентификаторы) и оптимизация (инлайнинг, удаление мёртвого кода). Включается простой конфигурацией:

buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } 

proguard-android-optimize.txt — базовый файл от Google с агрессивными оптимизациями. proguard-rules.pro — ваши кастомные правила. R8 читает синтаксис ProGuard, так что старые проекты можно переносить без изменений. R8 в 2–3 раза быстрее ProGuard при минификации и обеспечивает лучшее сжатие кода, снижая размер APK на 25–35%. Например, в одном проекте мы сократили APK с 45 МБ до 28 МБ, сохранив полную функциональность — это дало экономию на трафике до $2000 в год. После внедрения правил мы сократили размер APK на 40%, что сэкономило клиенту $2500 в год на CDN.

Почему после обфускации приложение крашится?

Основная причина — рефлексия. R8 работает на этапе компиляции и не знает, какие классы будут вызваны через Class.forName() или чьи поля будут прочитаны рефлексивно. В 80% проектов мы находим ошибки в keep-правилах, которые приводят к крашам. Типичные жертвы:

  • JSON-библиотеки (Gson, Moshi без codegen): UserResponse.userId может стать a.a, и Gson не найдёт поле. Решение: @Keep на классе или правило -keepclassmembers class com.example.data.** { *; }. Для новых проектов рекомендуем kotlinx.serialization с KSP — там кодогенерация на этапе компиляции, рефлексия не нужна.
  • Retrofit-интерфейсы: аннотации методов читаются рефлексией. Правило: -keep interface com.example.api.** { *; }.
  • Parcelable и Serializable: поля, передаваемые через Intent, должны сохранять имена. Правило: -keepclassmembers class * implements android.os.Parcelable { *; }.
  • JNI-методы: если из C++ вызывается Java-метод, имя должно быть точным. Правило: -keepclasseswithmembernames class * { native <methods>; }.
  • Firebase Crashlytics: стектрейсы станут нечитаемыми без mapping-файла. Убедитесь, что в build.gradle подключён com.google.firebase.crashlytics, тогда mapping загрузится автоматически. Храните mapping-файл для каждой версии — без него старые краши не деобфусцировать.

Как правильно составить keep-правила?

Цель Правило
Сохранить весь пакет data -keep class com.example.data.** { *; }
Сохранить классы с аннотацией @Keep (аннотация из библиотеки support-annotations или androidx)
Сохранить вложенные классы -keep class com.example.**$* { *; }
Сохранить enum-сериализацию -keepclassmembers enum * { *; }
Сохранить модели для Gson -keepclassmembers class * { @com.google.gson.annotations.SerializedName <fields>; }

Как проверить, что обфускация корректна?

После сборки выполните:

  • -printusage build/outputs/usage.txt — список удалённого кода.
  • –printseeds build/outputs/seeds.txt — что сохранено.
  • apkanalyzer dex packages app-release.apk — проверьте, что нужные классы присутствуют.

Обязательно тестируйте release-сборку на реальном устройстве через Firebase App Distribution или внутренний трек Google Play. Debug-сборка с isMinifyEnabled = false не покажет проблем. Google рекомендует: "Always keep a mapping file for each release and test release builds on at least one device before publishing."

Как деобфусцировать crash-репорты?

Mapping-файл — ключ к читаемым стектрейсам. Он генерируется R8 при каждой release-сборке и лежит в app/build/outputs/mapping/release/mapping.txt. При интеграции с Firebase Crashlytics этот файл автоматически загружается в консоль Firebase. Если вы меняете обфускацию, старые стектрейсы не деобфусцировать — храните mapping для каждой версии. Мы настраиваем архивацию mapping-файлов в CI/CD и подключаем их к Crashlytics.

Процесс настройки обфускации в наших проектах

  1. Анализ существующих ProGuard-правил и выявление потенциально проблемных мест (рефлексия, JNI, сериализация).
  2. Написание кастомных правил keep с учётом специфики проекта.
  3. Сборка release-версии с полным тестированием: прокрутка всех экранов, вызовы API, работа с push-уведомлениями.
  4. Проверка crash-репортов и уточнение правил по необходимости.
  5. Настройка автоматической загрузки mapping-файла в Firebase Crashlytics и CI/CD.
  6. Документация правил и процесса релиза.

Типичные ошибки и их решения

Проблема Причина Решение
ClassNotFoundException при рефлексии Класс удалён tree shaking Добавьте -keep для класса
NullPointerException на модели Gson не находит поле после обфускации Используйте @Keep или -keepclassmembers с аннотацией SerializedName
Краши без читаемого стектрейса Не загружен mapping-файл Настройте автоматическую загрузку в Crashlytics

Что входит в работу

Мы предоставляем:

  • Аудит текущих правил и их оптимизацию.
  • Написание кастомных keep-правил для вашего стека.
  • Тестирование release-сборки с отслеживанием крашей.
  • Настройку интеграции mapping-файла с Firebase Crashlytics.
  • Консультацию команды по процессу обфускации и поддержку при релизе.

Сроки и стоимость

Ориентировочные сроки — от 2 до 5 дней в зависимости от сложности проекта и количества библиотек. Стоимость рассчитывается индивидуально после аудита. Получите консультацию — напишите нам, мы проанализируем ваши правила и предложим план. Свяжитесь с нами, чтобы обсудить ваш проект.

Мы используем ProGuard и официальную документацию R8 от Google. Наш опыт — более 50 проектов с обфускацией. Гарантируем стабильную работу release-сборки.