Как избавиться от добавленной обработки аннотаций по запрошенному предупреждению?

Я только начал использовать разработку Android и пытался использовать библиотеку комнаты. Со вчерашнего дня я сталкиваюсь с этим предупреждением

w: [kapt] Запрошена обработка добавочной аннотации, но поддержка отключено, поскольку следующие процессоры не являются инкрементными: androidx.lifecycle.LifecycleProcessor(NON_INCREMENTAL), androidx.room.RoomProcessor(NON_INCREMENTAL).

Я попытался исследовать и исправить, но не смог избежать этой ошибки, вот мой файл grale.build. пожалуйста, предложите/посоветуйте, что я делаю не так.

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "ps.room.bookkeeper"
        minSdkVersion 15
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation":"$projectDir/schemas".toString()]
            }
        }    
    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'
    implementation 'com.google.android.material:material:1.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    // life cycle dependencies
    def lifecycle_version = "2.0.0"
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    kapt "android.arch.lifecycle:compiler:$lifecycle_version"

    //Room dependencies
    //def room_version = "2.1.0"
    implementation 'android.arch.persistence.room:runtime:2.1.0'
    kapt 'android.arch.persistence.room:compiler:2.1.0'
    //annotationProcessor 'android.arch.persistence.room:compiler:2.1.0'

//    implementation "android.arch.lifecycle:extensions:$room_version"
//    kapt "android.arch.persistence.room:compiler:$room_version"
//    androidTestImplementation "android.arch.persistence.room:testing:$room_version"

    //implementation 'androidx.room:room-runtime:2.1.0'
    //annotationProcessor 'androidx.room:room-compiler:2.1.0'
}

Ответы

Ответ 1

В версии 1.3.50, как упоминалось в @Necrontyr, есть ошибка в версии kotlin-gradle-plugin. Просто понизьте версию kotlin_version в build.gradle(Project) до версии 1.3.41.

Ответ 2

Просто добавьте эту строку к вам gradle.properties:

kapt.incremental.apt=true

Ответ 3

Реальная проблема заключается в том, что инкрементная обработка делает вещи быстрее, но если какой-либо из процессоров аннотаций не является инкрементным, ни один из них на самом деле не будет обработан таким образом.

Какова цель инкрементальной обработки?

Начиная с версии 1.3. 30+, инкрементная обработка позволяла не обрабатывать модули снова полностью при каждом изменении, что повышает производительность процесса сборки:

Основное внимание в этом выпуске уделялось Производительность Kotlin/Native, KAPT, а также улучшения для IntelliJ IDEA.

Из документации Kotlin:

Процессоры аннотаций (см. JSR 269) поддерживаются в Kotlin с помощью плагин капт компилятор. В двух словах, вы можете использовать библиотеки, такие как Dagger или Data Binding в ваших проектах Kotlin.

Как исправить добавочную обработку комнаты?

А процессор добавочных аннотаций Room отключен по умолчанию. Это известная проблема, и она описана здесь. Они намерены исправить это на версии 2.2.0. Вы можете просто подождать обновления или включить его, чтобы избавиться от предупреждения, установив:

в файле gradle.properties:

kapt.incremental.apt=true

(необязательные шаги)

чтобы привязка данных была добавочной:

android.databinding.incremental=true

для более быстрой сборки:

kapt.use.worker.api=true

если сделано всего несколько изменений, время сборки значительно уменьшается:

kapt.include.compile.classpath=false

(вернуться к теме)

в свой проект build.gradle добавьте необходимые зависимости (Groovy):

dependencies {
    ...
    implementation "androidx.room:room-runtime:2.2.0-rc01"
    annotationProcessor "androidx.room:room-compiler:2.2.0-rc01"
}

и

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.incremental":"true"]
            }
        }
    }
}

Версия Kotlin DSL:

dependencies {
    ...
    implementation("androidx.room:room-runtime:2.2.0-rc01")
    kapt("androidx.room:room-compiler:2.2.0-rc01")
}

и

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = mapOf("room.incremental" to "true")
            }
        }
    } 
}

Edit:

9 октября 2019 г.

androidx.room:room-*:2.2.0 выпущен.

Gradle Процессор добавочной аннотации: Комната теперь Gradle изолирующий процессор аннотаций и возможность увеличения могут быть включены через Вариант процессора комната. Инкремент.

Ответ 4

Из документации по комнате:

"Комната имеет следующие параметры процессора аннотаций... room.incremental: Включает инкрементный обработчик аннотаций Gradle."

android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                    "room.schemaLocation":"$projectDir/schemas".toString(),
                    "room.incremental":"true",
                    "room.expandProjection":"true"]
            }
        }
    }
}

Обязательно обновите версию комнаты до версии 2.2.x или выше.

Ответ 5

Вот список действий, которые вы можете сделать, чтобы исправить это и значительно сократить время сборки, пока вы на нем.

В вашем файле build.gradle (модуль):

android {
    ...
    defaultConfig {
        ...
        kapt {
            arguments {
                 arg("room.schemaLocation", "$projectDir/schemas".toString())
                 arg("room.incremental", "true")
                 arg("room.expandProjection", "true")
            }
        }
    }
    ...
}

В вашем файле gradle.properties:

kapt.incremental.apt=true            // enabled by default on 1.3.50+
kapt.use.worker.api=true             // faster builds
kapt.include.compile.classpath=false // near instant builds when there are few changes

android.databinding.incremental=true
android.lifecycleProcessor.incremental=true
//add your specific library if it supports incremental kapt 

Ответ 6

Многие другие ответы здесь прикрывают ошибку или отключают инкрементную обработку вместо того, чтобы фактически заставить ее работать так, как вы хотите.

Вы можете включить инкрементную обработку для вашей конкретной библиотеки в файле gradle.properties. Просто добавьте эти настройки или в зависимости от того, какая из них соответствует библиотеке, которая выдает ошибку:

android.databinding.incremental=true
android.lifecycleProcessor.incremental=true

Ответ 7

Что вам действительно нужно сделать, так это реализовать эти строки кода в теге buildConfig в приложении модуля build.gradle:

javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                        "room.schemaLocation"  : "$projectDir/schemas".toString(),
                        "room.incremental"     : "true",
                        "room.expandProjection": "true"]
            }
        }

Ответ 8

Если он жалуется на то, что "запрашивается инкрементная обработка аннотаций, но поддержка отключена, поскольку следующие процессоры не являются инкрементными", тогда установка "kapt.incremental.apt" в "true" (упоминается в другом ответе) в gradle.properties является встречным. интуитивный. Вам нужно установить его на "ложь". Это сделало это для меня.

Ответ 9

Я использую AndroidX, но, похоже, то же самое для android.arch.lifecycle. Для меня это просто помогло заменить это:

kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

... с этим:

implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

Так что если вы используете android.arch.lifecycle, он может иметь такой же эффект, заменив это:

kapt "android.arch.lifecycle:compiler:$lifecycle_version"

... с этим:

implementation "android.arch.lifecycle:common-java8:$lifecycle_version"

Имейте в виду, что это работает только в том случае, если вы используете Java 8, и вам также следует удалить OnLifecycleEvent аннотации для LifecycleObserver классов и позволить этим наблюдателям реализовать DefaultLifecycleObserver вместо этого.

Переход на этот метод также рекомендуется в зависимости build.gradle, показанной здесь.