Avatar ·

Использую устаревшие функции Gradle: как исправить "Deprecated Gradle features were used"?

Всем привет! Я начинающий Android-разработчик на Kotlin, и у меня возникла проблема при сборке проекта. После обновления Gradle до версии 5.0 я получаю сообщение об ошибке: "Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0". Сборка падает, и я не могу запустить приложение. Вот мой файл `build.gradle` (уровень проекта): ```kotlin // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.3.31' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } ``` И модульный `build.gradle` (app): ```kotlin apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.myapp" minSdkVersion 21 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } 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-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.core:core-ktx:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } ``` Я использую JUnit 4 для тестов. Ошибка появляется при запуске `./gradlew build`. Что я делаю не так? Как убрать устаревшие функции и сделать сборку совместимой с Gradle 5.0? <<>>

Почему возникает ошибка и как её исправить?

Ошибка "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.