При включении оптимизации приложения с настройками по умолчанию 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 .
Соблюдайте правила для авторов библиотеки
Ознакомившись с глобальными параметрами и синтаксисом правил сохранения, более подробную информацию см. в разделе Оптимизация для авторов библиотек .