Як позбутися від поступової обробки анотацій, просили попередження?


150

Я щойно почав використовувати розробку для 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
спробуйте додати android.enableSeparateAnnotationProcessing = вірно у вашому gradle.properities reddit.com/r/androiddev/comments/ai92pt/… знайденого з цього приводу, це може бути пов’язано з вашою проблемою
Ferhat Ergün

7
Наразі ви можете поновити kotlin-gradle-плагін у своєму проекті build.gradle до версії 1.3.41. Я думаю, що це помилка, пов’язана з kapt. Більше інформації: youtrack.jetbrains.com/issue/KT-33515
Necrontyr

5
Ви також можете створити файл gradle.properties у libs / <назва вашого модуля>, kapt.incremental.apt=falseяк описано у випуску як вирішення. Це працювало для мене.
Некротир

2
@Necrontyr, ваша пропозиція справді спрацювала. Велике спасибі
Shax

Відповіді:


80

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


71
Помилка, згадана @Necrontyr, не пов’язана з попередженням. Попередження насправді призначене і знижується до 1.3.41, просто приховує попередження, але проблема залишається такою ж, якщо не гіршою. Люди можуть подумати, що оскільки вони ввімкнули покрокову обробку анотацій, це зробить все швидше. Але правда полягає в тому, що якщо будь-який з процесорів анотацій не буде поступовим, жоден з них не буде оброблятися поступово. Це дружнє нагадування, яке вкаже на те, яка бібліотека є винуватцем.
Антимоніт

15
Використання застарілої бібліотечної версії не є рішенням.
Андрій Костер

5
Чи все ж таки це стосується Котліна 1.3.70?
ІгорГанапольський

2
Я використовую Kotlin 1.3.72 і все ще стикаюся з цією проблемою?
Анбусельван Рокі

4
Я також стикаюся з цим питанням 1.3.72 будь-яке рішення хлопців?
hiashutoshsingh

174

Просто додайте цей рядок до свого gradle.properties:

kapt.incremental.apt=true

11
Це кращий варіант, що прийнята відповідь. Для тих , кому потрібно зрозуміти і потрапити в більш докладної інформації, зверніться по цьому посиланню: medium.com/avast-engineering / ...
Abhimanyu

4
помилка і для мене.
Стівен Сміт

хтось причина, чому це відбувається тут?
Омер

Нещодавно я включив прив’язку даних до свого проекту Android (kotlin) і почав отримувати це попередження. Додавання майна, як зазначено вище, працювало для мене. Також використовуються найновіші версії всього, наприклад, усіх залежностей, компіляторів, інструментів збирання, SDK тощо.
Gail

4
Роблячи саме це, мені не вийшло. Мені довелося також редагувати свій файл build.gradle, як описано в документації до бібліотеки Кімнат .
Нельсон Феррагут

121

Справжня проблема полягає в тому, що покрокова обробка робить все швидше, але якщо будь-який з процесорів анотацій не є інкрементальним, жоден з них фактично не буде оброблений таким чином.

Яка мета покрокової обробки?

Починаючи з версії 1.3.30+ , додаткова обробка дозволила модулям не повторно оброблятись щоразу, коли відбувається зміна, що забезпечує процес збірки більш високу продуктивність:

Основні напрямки цього випуску були навколо Kotlin / Native, KAPT, а також вдосконалення для IntelliJ IDEA.

З документації Котліна :

Процесори анотацій (див. JSR 269) підтримуються в Kotlin плагіном компілятора kapt. У двох словах, ви можете використовувати бібліотеки, такі як кинджал або прив'язка даних у своїх проектах 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"]
            }
        }
    }
}

Версія DSL Kotlin:

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: Кімната тепер є процесором виділення приміток Gradle, і збільшення можливостей можна ввімкнути за допомогою параметра процесора room.incremental.


8
Це слід сприймати як kapt.incremental.apt = true - це те, чого не вистачить, якщо включити Кімната у свій проект. Цього навіть не згадують у документах Android для Room
sela

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). Тому не має сенсу вмикати його, оскільки це включено за замовчуванням.
Дімас Мендес

37

З документації про номер :

"У номері є такі параметри процесора анотацій ... room.incremental: Вмикає процесор додаткового анотації Gradle."

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

Обов’язково оновіть версію кімнати до 2.2.x або вище.


3
Правильно відповідайте людям, якщо ви хочете продовжувати поступову обробку. Можливо, вам не знадобляться аргументи схеми розташування або розширення параметрів проекту, встановлені вище. room.incremental досить.
bajicdusko

1
За версією developer.android.com/jetpack/androidx/releases/room , все ще існує версія 2.2.0-rc01.
CoolMind


Оновіть версію кімнати до 2.2.0, це працювало для мене
DivideBy0

25

Ось список речей, які ви можете зробити, щоб виправити це, і значно скоротити час створення, поки ви працюєте.

У вашому 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 

18

Увімкнути запит на обробку додаткового опису Kapt

Використовуйте Kotlin 1.3.31 або новішу версію Kotlin 1.3.30

У вашому андроїдному проекті 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 не було включено поступову обробку.
Жак.S

5

Якщо ви скаржаться на те, що "Потрібна обробка додаткової анотації, але підтримка відключена, оскільки наступні процесори не є поступовими", то встановлення "kapt.incremental.apt" на "справжнє" (згадується в іншій відповіді) у gradle.properties є зустрічним інтуїтивно зрозумілий. Потрібно встановити його на "false". Це зробило це для мене.


1
ЦЕ фактично спрацювало. Встановіть його на ЛЮДИХ людей! дякую
Сакібой

А що буде? Чи збирається вона швидше або просто приховує попередження?
CoolMind

@CoolMind Ви б відключили покрокову обробку анотацій, що все одно не відбудеться, якщо хтось із ваших залежностей не підтримує це. Отже, попередження відходить, і в процесі збирання немає змін раніше.
DC Крістофер

2
Дивовижна настройка kapt.incremental.apt=falseдопомогла мені, я більше не отримував помилку
Рахі Давале,

2
У вас немає більше помилок, але тепер у вас немає додаткової обробки :)
JustATHERCoder

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депозитах, показаних тут .


Чому ти позбавляється 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"]
            }
        }

0

Вище відповіді можуть бути корисні, але то , що допомогло мені скорочує kotlin_versionв build.gradle(Project)до 1.3.41і побудови проекту. Це дозволить вам побачити, чи є проблема з моделлю вашої особи.

Моє було, я забув коментувати @PrimaryKey. У вас може бути щось інше. Котлін 1.3.41дозволяє побачити ці проблеми. Виправте ці проблеми та поверніть їх kotlin_versionдо попереднього.


-1

Це також може бути викликано проблемами з символами, такими як " İ " на стороні прив'язки даних, коли системна мова є неанглійською мовою. У такому випадку використання мови комп'ютерної системи англійською мовою вирішить проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.