При включении оптимизации приложения с настройками по умолчанию R8 выполняет обширную оптимизацию для максимального повышения производительности. R8 вносит существенные изменения в код, включая переименование, перемещение и удаление классов, полей и методов. Если вы обнаружите, что эти изменения вызывают ошибки, вам необходимо указать, какие части кода R8 не следует изменять, указав их в правилах сохранения.
Типичные сценарии, требующие сохранения правил
R8 идентифицирует и сохраняет все прямые вызовы в вашем коде. Однако R8 не видит косвенного использования кода, что может привести к удалению кода, необходимого вашему приложению, и, как следствие, к сбоям. Используйте правила сохранения, чтобы указать R8 сохранять такой косвенно используемый код. Вот несколько распространенных ситуаций, когда вам могут понадобиться правила сохранения:
- Доступ к коду осуществляется с помощью рефлексии: 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 расположенный в корневом каталоге модуля приложения — возможно, файл уже существует, но если его нет, создайте его. Чтобы применить правила из этого файла, необходимо объявить его в файле 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 во всей вашей кодовой базе. Для получения дополнительной информации см. раздел «Глобальные параметры» .
Правила сохранения : Правила сохранения необходимо тщательно продумывать, чтобы обеспечить правильный баланс между максимальной оптимизацией кода и предотвращением случайного сбоя в работе приложения. Чтобы узнать, как писать правила сохранения, см. раздел «Добавление правил сохранения» .
Сохраняйте правила для авторов библиотеки.
После ознакомления с глобальными параметрами и синтаксисом правил сохранения, см. раздел «Оптимизация для авторов библиотек» для получения более подробной информации.