При включении оптимизации приложения с настройками по умолчанию R8 выполняет обширную оптимизацию для максимального повышения производительности. R8 вносит существенные изменения в код, включая переименование, перемещение и удаление классов, полей и методов. Если вы обнаружите, что эти изменения вызывают ошибки, вам необходимо указать, какие части кода R8 не следует изменять, указав их в правилах сохранения.
Типичные сценарии, требующие сохранения правил
R8 identifies and preserves all direct calls in your code. However, R8 cannot see indirect code usages, which can cause it to remove code that your app needs, causing crashes. Use keep rules to tell R8 to preserve such indirectly used code. A few common situations where you are likely to need keep rules are as follows:
- Доступ к коду осуществляется с помощью рефлексии: R8 не может определить, когда доступ к классам, полям или методам осуществляется с помощью рефлексии. Например, R8 не может идентифицировать метод, найденный по его имени с помощью
Class.getDeclaredMethod(), или аннотацию, полученную с помощьюClass.getAnnotation(). В этих случаях R8 может переименовать эти методы и аннотации или полностью удалить их, что приведет к исключениюClassNotFoundExceptionилиNoSuchMethodExceptionво время выполнения. - Code called from Java Native Interface (JNI): When native (C or C++) code calls a Java or Kotlin method, or Java or Kotlin code calls C++ code with JNI, the call is based on a dynamic string lookup of the method's name. R8 can't see the dynamic string-based method call, and so its optimizations might break your code.
Это не исчерпывающий список сценариев, требующих использования правил сохранения, но он охватывает большинство случаев, когда такие правила могут понадобиться.
Как добавить правила сохранения в ваше приложение
Настройки правил сохранения зависят от используемой вами версии AGP.
В больших приложениях код обычно находится в нескольких модулях библиотеки. В таких случаях часто лучше размещать правила сохранения кода рядом с кодом, к которому они применяются, в рамках конкретного модуля библиотеки. Ключевое различие в управлении правилами сохранения кода для библиотек заключается в том, как вы объявляете эти правила в файле build.gradle.kts (или build.gradle ) вашего модуля библиотеки. Подробнее см. в разделе «Оптимизация для авторов библиотек» .
Для версий AGP 9.3 и выше
Добавьте свои правила в файл с расширением .keep в каталоге src/<variant>/keepRules . Например, src/main/keepRules/custom-rules.keep . Обратите внимание, что использование обновленного DSL для AGP 9.3 и выше позволяет оптимизировать как код, так и ресурсы, и не требует явного определения файла правил сохранения Android по умолчанию ( proguard-android-optimize.txt ), поскольку он включен по умолчанию, если не опущен явно.
Котлин
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Классный
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Отключить правила сохранения данных по умолчанию для платформы Android (Расширенные настройки)
AGP provides a set of default Android platform rules. To omit these rules from your project's configuration and manage all keep rules yourself, set optimization.keepRules.includeDefault to false .
Котлин
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
Классный
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
Устаревший DSL для версий AGP ниже 9.3
Add your rules to a proguard-rules.pro file located in the app module's root directory—the file might already be there, but if it isn't, create it. To apply the rules in the file, you must declare the file in your module-level build.gradle.kts (or build.gradle ) file.
By default, your build file also includes the proguard-android-optimize.txt file. This file includes rules that are required for most Android projects, so you should let it remain in the build file. This file is based on, and shares content with, the proguard-common.txt file.
Устаревший DSL (Kotlin)
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
// Default file with default optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
}
}
}
Устаревший DSL (Groovy)
android {
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
// Default file with default optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
Добавить правило сохранения
При добавлении правил хранения вы можете включать глобальные параметры, а также определять собственные правила хранения.
Глобальные параметры : Глобальные параметры — это общие директивы, влияющие на работу R8 во всей вашей кодовой базе. Для получения дополнительной информации см. раздел «Глобальные параметры» .
Keep rules : Keep rules need to be designed carefully, to make sure you get the right balance between maximizing code optimization without inadvertently breaking your app. To learn how to write keep rules, see Add keep rules .
Сохраняйте правила для авторов библиотеки.
После ознакомления с глобальными параметрами и синтаксисом правил сохранения, см. раздел «Оптимизация для авторов библиотек» для получения более подробной информации.