Это инструмент, задача которого поменять имена объектов, классов, методов, тем самым затрудняя анализ кода для реверс-инженера. Помимо этого он еще и оптимизирует код, удаляя неиспользуемые в программе ресурсы.
С версии Android Gradle 3.4.0 плагин больше не использует ProGuard для оптимизации кода во время компиляции. Вместо этого плагин работает с оптимизатором R8, который разработал Google.
Команды ProGuard полностью совместимы с R8.
Его задачи:
android {
buildTypes {
getByName("release") {
//Включает сжатие кода, запутывание и оптимизацию только
//для типа сборки "release".
isMinifyEnabled = true
// Включает сжатие ресурсов
isShrinkResources = true
// Включает файлы правил ProGuard по умолчанию,
// упакованные с подключаемым модулем Android Gradle.
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
...
}
Когда создаете новый проект или модуль с помощью Android Studio, среда IDE создает <module-dir>/proguard-rules.pro
файл, в котором можно указать свои собственные правила. Также можно включить дополнительные правила из других файлов, добавив их к proguardFiles
свойству в build.gradle
файле вашего модуля.
Например, вы можете добавить правила, специфичные для каждого варианта сборки, добавив еще одно proguardFiles
свойство в соответствующий productFlavor
блок. Следующий файл Gradle дополняет flavor2
конфигурацией flavor2-rules.pro
. Теперь flavor2
использует все три правила ProGuard, потому что также применяются правила из блока release
android {
...
buildTypes {
getByName("release") {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
//Перечислите здесь дополнительные правила ProGuard для данного
//типа сборки. По умолчанию,
//Android Studio создает и включает для вас пустой файл правил
//(расположенный в корневом каталоге каждого модуля).
flavorDimensions.add("version")
productFlavors {
create("flavor1") {
...
}
create("flavor2") {
proguardFile("flavor2-rules.pro")
}
}
}
В большинстве случаев файла правил ProGuard по умолчанию ( proguard-android- optimize.txt
) достаточно, чтобы R8 удалил только неиспользуемый код. Однако в некоторых ситуациях R8 сложно правильно проанализировать, и он может удалить код, который действительно нужен вашему приложению.
Чтобы исправить ошибки и заставить R8 сохранить определенный код, нужно добавить
-keep
строку в файл правил ProGuard. Например:
-keep public class MyClass