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

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'
}

Shax

Ответы (14)

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

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

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

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

Я использую 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 показанных зависимостях здесь.

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

В вашем файле 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 

Начиная с версии 1.3.30, kapt поддерживает инкрементную обработку аннотаций в качестве экспериментальной функции. Тем не менее, начиная с версии 1.3.50, добавочная обработка аннотаций включена по умолчанию.

Итак, вы должны добавить строку kapt.incremental.apt = true в свой gradle.properties файл, чтобы включить инкрементную обработку аннотаций, если ваша версия kapt больше или равно 1,3.30 и меньше 1,3,50. В противном случае; вам не нужно устанавливать kapt.incremental.apt на true, чтобы включить его. Хотя вы можете установить его на false, чтобы отключить его, если хотите.

Помимо всего этого;инкрементная обработка аннотаций требует, чтобы была включена инкрементная компиляция. Итак, вы должны добавить строку kotlin.incremental = true в свой файл gradle.properties, чтобы воспользоваться функцией инкрементной обработки аннотаций.

Обратите внимание, что опция инкрементной обработки аннотаций для Комнаты: ВКЛ по умолчанию, начиная с версии 2.3.0-alpha02. Это означает, что вам не нужно устанавливать аргумент room.incremental в true, если ваша версия библиотеки больше или равна этой. Чтобы узнать больше, см. issue # 112110217.

Также обратите внимание, что если вы используете Android Gradle Plugin 3.6.x или новее, опция инкрементальной обработки аннотаций ВКЛ по умолчанию для привязки данных. Таким образом, вам не нужно добавлять строку android.databinding.incremental = true в ваш файл gradle.properties. Чтобы узнать больше, см. issue # 110061530.

Это также может быть вызвано проблемами с символами, такими как «İ» на стороне привязки данных, если язык системы не английский. В таком случае использование английского языка компьютерной системы решит проблему.

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

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

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

для меня это происходит, когда моя сущность с первичным ключом и аннотацией @NonNull, но поле типа все еще использует значение NULL (?). итак, просто удалите это?, проблема исчезла

data class TvEntity(
        @PrimaryKey
        @NonNull
        @ColumnInfo(name = "tvId")
        var tvId: String?,

Включить запрос на обработку инкрементальных аннотаций Kapt

Используйте Kotlin 1.3.31 или новее Выпущен Kotlin 1.3.30

В вашем проекте android kotlin файл gradle.properties

# Enable Kapt Incremental annotation processing requeste
kapt.incremental.apt=true

# Enable android.databinding.annotationprocessor.ProcessDataBinding (DYNAMIC)
android.databinding.incremental=true

# Decrease gradle builds time 
kapt.use.worker.api=true

# turn off AP discovery in compile path, and therefore turn on Compile Avoidance
kapt.include.compile.classpath=false

# Enable In Logcat to determine Kapt
kapt.verbose=true

Приведенные выше ответы могут быть полезны, но мне помогло сокращение kotlin_version в build.gradle (Project) до 1.3.41 и создание проекта. . Это позволит вам увидеть, есть ли какие-либо проблемы с вашей моделью сущности.

У меня было, забыл аннотировать @ PrimaryKey. У вас может быть что-то другое. Kotlin 1.3.41 позволяет увидеть эти проблемы. Исправьте эти проблемы и верните свою kotlin_version к предыдущей.

От Документация по номеру:

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

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

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

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

kapt.incremental.apt=true
• 100001

Для чего нужна инкрементальная обработка?

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

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

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

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

Как исправить инкрементную обработку помещения?

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

в gradle.properties файл:

kapt.incremental.apt = true

(дополнительные шаги)

, чтобы разрешить инкрементную привязку данных:

android.databinding.incremental=true

for faster builds:

kapt.use.worker.api=true

if only a few changes are made, the build time greatly decreases:

kapt.include.compile.classpath=false

(back to the subject)

in your project build.gradle, add the necessary dependencies (Groovy):

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

and

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

Kotlin DSL version:

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

and

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

October 9, 2019

androidx.room:room-*:2.2.0 is released.

Gradle Incremental Annotation Processor: Room is now a Gradle isolating annotation processor and incrementability can be enabled via the processor option room.incremental.

Latest update:

For the newest Kotlin DSL versions, please use

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

2022 WebDevInsider