Avatar ·

Устаревший RegisterResGeneratingTask в Android Gradle плагине: как исправить?

Привет! Я обновил Android Studio до версии 3.0 и столкнулся с предупреждением при сборке проекта. В логах Gradle пишет: "RegisterResGeneratingTask is deprecated, use registerGeneratedFolders(FileCollection)". У меня в проекте используется Kotlin, и я подключаю сторонние библиотеки через Gradle. В файле `build.gradle` (уровня модуля) у меня есть вот такая простая конфигурация: ```kotlin android { compileSdkVersion 26 defaultConfig { applicationId "com.example.myapp" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' } ``` Я не использую явно `RegisterResGeneratingTask`, но предупреждение всё равно появляется. Сборка проходит успешно, но это раздражает. Как избавиться от этого предупреждения? Нужно ли менять что-то в Gradle файлах или настройках проекта? Помогите, пожалуйста! <<>>

Почему возникает предупреждение и как оно влияет на проект?

Предупреждение RegisterResGeneratingTask is deprecated появляется при использовании Android Gradle Plugin (AGP) версии 3.0.0 и выше. Это связано с тем, что внутренний API плагина был изменён: старый метод registerResGeneratingTask (используемый для регистрации задач по генерации ресурсов) заменён на более гибкий registerGeneratedFolders(FileCollection). Само предупреждение не блокирует сборку, но указывает на использование устаревшего API, который может быть удалён в будущих версиях AGP.

Обычно проблема возникает, если вы используете библиотеки или плагины, которые совместимы только со старыми версиями AGP, либо если у вас в проекте есть кастомные Gradle-таски, написанные до выхода AGP 3.0. Если вы не писали свои таски, значит, предупреждение исходит от одной из зависимостей — например, от старой версии Kotlin плагина или библиотеки поддержки.

Решение: обновление зависимостей и плагинов

Самый надёжный способ — обновить все компоненты до актуальных версий. Вот пошаговая инструкция:

  1. Обновите Android Gradle Plugin в корневом build.gradle:
buildscript {
    ext.kotlin_version = '1.3.61' // или новее
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3' // замените на 3.5.3 или новее
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
  1. Обновите Kotlin до версии 1.3.61+ (или 1.4.x) — в старых версиях (до 1.2) была несовместимость с AGP 3.0+:
ext.kotlin_version = '1.3.61' // в корневом build.gradle
  1. Обновите библиотеки поддержки в модульном build.gradle. Замените старые com.android.support на androidx (если проект мигрирует) или хотя бы на последние версии support-библиотек (28.0.0):
dependencies {
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    // остальные зависимости
}
  1. Очистите кеш и пересоберите проект:
./gradlew clean build

Альтернативный способ: явное подавление предупреждения

Если обновить зависимости невозможно (например, из-за устаревшего API), вы можете отключить это конкретное предупреждение. Добавьте в файл gradle.properties:

android.suppressDeprecatedApiWarning=true

Важно: Это лишь скрывает предупреждение, но не решает проблему. Рекомендуется только как временная мера.

Проверка после исправления

После обновлений запустите ./gradlew assembleDebug --info и убедитесь, что предупреждение исчезло. Если оно остаётся, проверьте, не используете ли вы сторонние Gradle-плагины (например, com.google.gms:google-services) — их тоже нужно обновить до версий, совместимых с AGP 3.5+.

<<>>

Ручное исправление через Gradle-скрипт

Если обновление не помогло (например, вы используете кастомные таски для генерации ресурсов), можно заменить устаревший вызов вручную. Найдите в своём проекте (или в build.gradle) места, где используется registerResGeneratingTask, и замените на новый API:

// Было (устаревшее):
// registerResGeneratingTask(myTask)

// Стало (новый способ):
registerGeneratedFolders(myTask.outputDir)

Также проверьте, не используете ли вы плагины, которые генерируют ресурсы (например, com.github.bumptech.glide:glide или com.google.dagger:dagger). В этом случае обновите их до версий, поддерживающих AGP 3.5+. Если плагин не обновляется, попробуйте отключить его генерацию ресурсов через options { generatedFolders = [] } в android { } блоке.

Дополнительный совет: В AGP 3.0+ появилась возможность указать папки для сгенерированных ресурсов в sourceSets:

android {
    sourceSets {
        getByName("main") {
            res.srcDirs = listOf("src/main/res", "src/generated/res")
        }
    }
}

Этот подход более гибкий и не требует использования устаревших тасков. Убедитесь, что ваша среда разработки (Android Studio) обновлена до последней версии, чтобы избежать подобных предупреждений в будущем.