Использую устаревшие функции Gradle: как исправить "Deprecated Gradle features were used"?
Почему возникает ошибка и как её исправить?
Ошибка "Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0" означает, что в вашем проекте используются функции Gradle, которые были помечены как устаревшие (deprecated) в версии 5.0. Gradle 5.0 стал более строгим к таким функциям и требует их замены. В вашем случае проблема связана с использованием плагина kotlin-android-extensions и некоторых настроек в build.gradle.
Основные причины и решения
- Плагин kotlin-android-extensions — этот плагин устарел начиная с Gradle 5.0 и Kotlin 1.3. Он использует синтетические свойства (synthetic properties) для доступа к View, что является устаревшей практикой. Вместо него рекомендуется использовать ViewBinding или Jetpack Compose.
- Устаревшие конфигурации репозиториев — использование
jcenter()также устарело, его нужно заменить наmavenCentral(). - Версии зависимостей — некоторые старые версии библиотек могут использовать устаревшие API Gradle.
Пошаговое исправление
1. Замените плагин kotlin-android-extensions на ViewBinding. В файле app/build.gradle удалите строку apply plugin: 'kotlin-android-extensions' и добавьте ViewBinding:
android {
...
buildFeatures {
viewBinding = true
}
}
Теперь в Activity или Fragment используйте ViewBinding вместо findViewById или синтетических свойств:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.button.setOnClickListener {
// Обработка клика
}
}
}
2. Замените jcenter() на mavenCentral() в обоих файлах build.gradle. JCenter больше не поддерживается, и его использование может вызывать предупреждения:
repositories {
google()
mavenCentral() // вместо jcenter()
}
3. Обновите версии зависимостей. Убедитесь, что вы используете актуальные версии библиотек. Например, замените JUnit 4 на JUnit 5, если это возможно, или обновите до последней стабильной версии:
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
Если вы хотите оставить JUnit 4, добавьте в build.gradle (уровень проекта) следующий блок, чтобы явно указать совместимость:
subprojects {
tasks.withType(Test) {
useJUnitPlatform()
}
}
4. Проверьте Gradle wrapper. Убедитесь, что вы используете последнюю версию Gradle wrapper. В файле gradle-wrapper.properties укажите:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
После изменений выполните синхронизацию проекта и запустите сборку с флагом --warning-mode all, чтобы увидеть все предупреждения:
./gradlew build --warning-mode all
Итоговый код (app/build.gradle)
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures {
viewBinding = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
После этих изменений ошибка должна исчезнуть. Если она остаётся, запустите сборку с флагом --stacktrace для получения подробной информации.
Альтернативный подход: отключение предупреждений
Если вы не хотите немедленно переписывать код под ViewBinding или обновлять все зависимости, можно временно отключить строгую проверку устаревших функций в Gradle. Это не рекомендуется для продакшена, но может помочь быстро запустить проект.
Добавьте в файл gradle.properties (уровень проекта) следующую строку:
org.gradle.warning.mode=none
Это отключит вывод всех предупреждений, включая deprecated features. Также можно использовать режим summary, чтобы видеть краткую сводку:
org.gradle.warning.mode=summary
Однако помните, что это лишь маскирует проблему. Для долгосрочной стабильности проекта лучше следовать рекомендациям из первого ответа и мигрировать на современные API. Устаревшие функции могут быть полностью удалены в будущих версиях Gradle, что приведёт к ошибкам сборки.
Если вы используете плагины, такие как kotlin-android-extensions, рассмотрите альтернативы: ButterKnife (тоже устарел) или DataBinding. Но ViewBinding — это официальная и рекомендуемая замена от Google.