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

162

Я только начал использовать разработку для 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
источник
почему ваш annotationProcessor прокомментирован? Вы пытались их раскомментировать, а затем собрать проект? (как для помещения, так и для жизненного цикла)
Ферхат Эргюн
1
попробуйте добавить android.enableSeparateAnnotationProcessing = true в свой gradle.properities reddit.com/r/androiddev/comments/ai92pt/…, найденный здесь, это может быть связано с вашей проблемой
Ферхат Эргюн,
7
Вы можете понизить версию kotlin-gradle-plugin в файле build.gradle вашего проекта до версии 1.3.41. Думаю, это ошибка, связанная с kapt. Более подробная информация: youtrack.jetbrains.com/issue/KT-33515
Necrontyr,
5
Вы также можете создать файл gradle.properties в libs / <your module name> kapt.incremental.apt=falseтоже, как описано в проблеме в качестве временного решения. У меня это сработало.
Necrontyr
2
@Necrontyr, ваше предложение действительно сработало. Большое спасибо
Shax

Ответы:

83

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

Мюкахид Камбур
источник
76
Ошибка, упомянутая @Necrontyr, не связана с предупреждением. Предупреждение на самом деле предназначено, и снижение до 1.3.41 просто скрывает предупреждение, но проблема остается той же, если не хуже. Люди могут подумать, что, если они включили инкрементную обработку аннотаций, это ускорит работу. Но правда в том, что если какой-либо из процессоров аннотаций не является инкрементным, то ни один из них не будет обрабатываться инкрементально. Это дружеское напоминание, которое укажет, какая библиотека виновата.
Антимонит
20
Использование устаревшей версии библиотеки не является решением.
Эндрю Костер
5
Так ли обстоит дело с Котлином 1.3.70?
Игорь Ганапольский
2
Я использую Kotlin 1.3.72 и все еще сталкиваюсь с этой проблемой?
Анбусельван Рокки
5
Я также сталкиваюсь с этой проблемой 1.3.72, ребята, какое решение?
hiashutoshsingh
186

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

kapt.incremental.apt=true
Али Ахмед
источник
12
Это лучший вариант, чем принятый ответ. Для тех , кому нужно понять и попасть в более подробной информации, обратитесь по этой ссылке: medium.com/avast-engineering/...
Abhimanyu
5
у меня тоже не получилось.
Стивен Смит
Кто-нибудь, в чем причина, почему это происходит здесь?
Омер
Недавно я включил привязку данных к своему проекту android (kotlin) и начал получать это предупреждение. Добавление свойства, как указано выше, сработало для меня. Также используются последние версии всего, например, всех зависимостей, компиляторов, инструментов сборки, SDK и т. Д.
Гейл
4
Это не помогло мне. Мне также пришлось отредактировать файл build.gradle, как описано в документации к библиотеке Room .
Нельсон Феррагут
131

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

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

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

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

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

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

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

Обработчик добавочных аннотаций комнат по умолчанию отключен . Это известная проблема, и она описана здесь . Они намерены исправить это в версии 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")
            }
        }
    } 
}

9 октября 2019 г.,

androidx.room:room-*:2.2.0 освобождается .

Процессор добавочных аннотаций Gradle: Room теперь является изолирующим процессором аннотаций Gradle, и возможность наращивания может быть включена с помощью параметра процессора room.incremental.

Последнее обновление:

Для новейших версий Kotlin DSL используйте

    javaCompileOptions {
        annotationProcessorOptions {
            arguments["room.incremental"] = "true"
        }
    }
Димас Мендес
источник
8
Это следует принять, поскольку kapt.incremental.apt = true - это то, чего не будет при включении Room в ваш проект. Этот даже не упоминается в документации Android для Room
села
1
Этот ответ помог мне, поскольку я использовал androidx.lifecycle:lifecycle-extensionsверсию 2.1.0, и после перехода на 2.2.0-beta01 предупреждение исчезло!
simne7
2
@ simne7 в конце концов зацените мою правку. Выпущена версия 2.2.0 =) вы можете обновить ее уже, чтобы получить доступ к функции инкрементной обработки и улучшить вашу сборку.
Димас Мендес,
Сделает ли включение android.buildcache=trueэто быстрее?
Игорь Ганапольский
1
@IgorGanapolsky согласно разработчиков Google Веб - сайт, Projects using Android plugin 2.3.0 and higher enable the build cache by default (unless you explicitly disable the build cache). Так что нет смысла включать его, так как он включен по умолчанию.
Димас Мендес,
39

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

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

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

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

Альберто Гаона
источник
3
Правильно ответьте люди, если хотите продолжить инкрементную обработку. Возможно, вам не потребуются аргументы schemaLocation или expandProjection, указанные выше. room.incremental достаточно.
bajicdusko
1
Согласно developer.android.com/jetpack/androidx/releases/room , все еще существует версия 2.2.0-rc01.
CoolMind
1
сейчас его нет -> developer.android.com/jetpack/androidx/releases/…
jesses.co.tt
Обновите версию комнаты до 2.2.0, это сработало для меня
DivideBy0
26

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

В вашем 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 
smdufb
источник
23

Включить запрос на добавочную обработку аннотаций 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
Сёму
источник
О чем android.lifecycleProcessor.incremental=true?
Игорь Ганапольский
10

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

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

android.databinding.incremental=true
android.lifecycleProcessor.incremental=true
Жак С.
источник
2
Я не так уверен в android.lifecycleProcessor.incremental=trueэтом, похоже, это нигде не задокументировано
Дэниел Уилсон
Я тоже не уверен, но я попробовал это догадываясь, и компилятор перестал сообщать мне, что в библиотеке lifecycleProcessor не включена инкрементная обработка.
Jacques.S
5

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

DC Кристофер
источник
1
ЭТО действительно сработало. Установите его на ЛОЖНЫХ людей! спасибо
Сакибой
А что будет? Будет ли он компилироваться быстрее или просто скроет предупреждение?
CoolMind
@CoolMind Вы бы отключили инкрементную обработку аннотаций, чего в любом случае не произойдет, если какая-либо из ваших зависимостей ее не поддерживает. Итак, предупреждение исчезает, и в процессе сборки нет никаких изменений по сравнению с предыдущим.
DC Christopher
2
На удивление настройка kapt.incremental.apt=falseмне помогла, я больше не получаю ошибку
Rakhi Dhavale
3
У вас больше нет ошибок, но теперь у вас нет инкрементальной обработки :)
JustAnotherCoder
2

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

Anigif
источник
Почему ты избавляешься kapt?
Игорь Ганапольский
@IgorGanapolsky Это то, что предлагает жизненный цикл AndroidX, если вы используете Java 8. Подробнее см. Здесь: developer.android.com/jetpack/androidx/releases/…
Anigif
kaptнеобходимо для Котлина
Игорь Ганапольский
1
Только если этого требует библиотека. Согласно этой странице, аннотации будут устаревшими, когда Java 8 станет более популярной на Android, поэтому они рекомендуют, common-java8если возможно: developer.android.com/reference/androidx/lifecycle/Lifecycle
Anigif
Интересно. Но kaptособо не упоминают ...
Игорь Ганапольский
2

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

javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
                        "room.schemaLocation"  : "$projectDir/schemas".toString(),
                        "room.incremental"     : "true",
                        "room.expandProjection": "true"]
            }
        }
coroutineDispatcher
источник
0

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

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

Сурав Рой
источник
0

Начиная с версии 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если ваша версия библиотеки больше или равна этой. Подробнее см. В выпуске №112110217 .

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

Сефа Келеш
источник
-1

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

Хасан Кучук
источник