О правилах хранения

При включении оптимизации приложения с настройками по умолчанию R8 выполняет масштабную оптимизацию для максимального повышения производительности. R8 вносит существенные изменения в код, включая переименование, перемещение и удаление классов, полей и методов. Если вы заметили, что эти изменения приводят к ошибкам, необходимо указать, какие части кода R8 не должен изменять, объявив их в правилах сохранения.

Распространенные сценарии, требующие соблюдения правил

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

  • Код, доступ к которому осуществляется с помощью рефлексии: R8 не может определить, когда доступ к классам, полям или методам осуществляется с помощью рефлексии. Например, R8 не может определить метод, найденный по имени с помощью Class.getDeclaredMethod() , или аннотацию, полученную с помощью Class.getAnnotation() . В этих случаях R8 может переименовать эти методы и аннотации или полностью удалить их, что приведет к исключению ClassNotFoundException или NoSuchMethodException во время выполнения.
  • Код, вызываемый из интерфейса Java Native Interface (JNI): когда нативный код (C или C++) вызывает метод Java или Kotlin, или код Java или Kotlin вызывает код C++ с JNI, вызов основан на динамическом поиске имени метода в строке. R8 не видит динамический вызов метода, основанный на строке, поэтому его оптимизация может привести к поломке кода.

Это не исчерпывающий список сценариев, требующих правил сохранения, но эти сценарии охватывают большинство случаев, когда вам могут понадобиться правила сохранения.

Как добавить правила сохранения в ваше приложение

Вам следует добавить свои правила в файл proguard-rules.pro , расположенный в корневом каталоге модуля app. Возможно, этот файл уже там есть, но если его там нет, создайте его. Чтобы применить правила из файла, необходимо объявить его в файле build.gradle.kts (или build.gradle ) на уровне модуля, как показано в следующем коде:

Котлин

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile("proguard-android-optimize.txt"),

                // File with your custom rules
                "proguard-rules.pro"
            )
           // ...
        }
    }
    // ...
}

Круто

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile('proguard-android-optimize.txt'),

                // File with your custom rules.
                'proguard-rules.pro'
            )
           // ...
        }
    }
    // ...
}

По умолчанию ваш файл сборки также включает файл proguard-android-optimize.txt . Этот файл содержит правила, необходимые для большинства проектов Android, поэтому его следует оставить в файле сборки. Этот файл основан на файле proguard-common.txt и имеет с ним общее содержимое.

Крупные приложения обычно содержат код в нескольких библиотечных модулях. В таких случаях часто лучше размещать правила сохранения вместе с кодом, к которому они применяются, внутри конкретного библиотечного модуля. Ключевое отличие в поддержке правил сохранения для библиотек заключается в том, как вы объявляете эти правила в файле build.gradle.kts (или build.gradle ) вашего библиотечного модуля. Подробнее см. в разделе «Оптимизация для авторов библиотек» .

Добавить правило сохранения

При добавлении правил хранения вы можете включить глобальные параметры, а также определить свои собственные правила хранения.

  • Глобальные параметры : Глобальные параметры — это общие директивы, влияющие на работу R8 во всей кодовой базе. Подробнее см. в разделе Глобальные параметры .
  • Правила Keep : правила Keep необходимо разрабатывать тщательно, чтобы обеспечить оптимальный баланс между максимальной оптимизацией кода и непреднамеренным нарушением работы приложения. Чтобы изучить синтаксис собственных правил Keep, см. раздел Синтаксис правил Keep .

Соблюдайте правила для авторов библиотеки

Ознакомившись с глобальными параметрами и синтаксисом правил сохранения, более подробную информацию см. в разделе Оптимизация для авторов библиотек .