Come sbarazzarsi dell'avvertimento richiesto per l'elaborazione delle annotazioni incrementali?


150

Ho appena iniziato a utilizzare lo sviluppo Android e provare a utilizzare la libreria Room. Da ieri sto affrontando questo messaggio di avvertimento

w: [kapt] Elaborazione annotazione incrementale richiesta, ma il supporto è disabilitato perché i seguenti processori non sono incrementali: androidx.lifecycle.LifecycleProcessor (NON_INCREMENTAL), androidx.room.RoomProcessor (NON_INCREMENTAL).

Ho provato a cercare e correggere ma non riesco a evitare questo errore qui è il mio file grale.build. per favore, suggerisci / consiglio cosa sto facendo di sbagliato.

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

perché la tua annotazioneProcessore è commentata? Hai provato a decommentarli e quindi a costruire un progetto? (sia per la stanza che per il ciclo di vita)
Ferhat Ergün,

1
prova ad aggiungere android.enableSeparateAnnotationProcessing = true nel tuo gradle.properities reddit.com/r/androiddev/comments/ai92pt/… trovato su questo, potrebbe essere correlato al tuo problema
Ferhat Ergün

7
Per il momento puoi eseguire il downgrade di kotlin-gradle-plugin nel tuo file build.gradle del progetto alla versione 1.3.41. Penso che sia un bug relativo a Kapt. Maggiori informazioni: youtrack.jetbrains.com/issue/KT-33515
Necrontyr

4
Puoi anche creare un file gradle.properties in libs / <il nome del tuo modulo> kapt.incremental.apt=falseanche come descritto nel problema come soluzione alternativa. Ha funzionato per me.
Necrontyr,

2
@Necrontyr, il tuo suggerimento ha funzionato davvero. Grazie mille
Shax,

Risposte:


80

C'è un bug nella versione di kotlin-gradle-plugin di 1.3.50 come menzionato da @Necrontyr. Esegui il downgrade di kotlin_version in build.gradle (Progetto) a 1.3.41.


71
Il bug citato da @Necrontyr non è correlato all'avvertimento. L'avvertimento è in realtà destinato e scendendo a 1.3.41 nasconde l'avviso ma il problema rimane lo stesso, se non peggio. Le persone potrebbero pensare che poiché hanno attivato l'elaborazione incrementale delle annotazioni renderà le cose più veloci. Ma la verità è che se uno qualsiasi dei processori di annotazione non è incrementale, nessuno di essi verrà elaborato in modo incrementale. Questo è un promemoria amichevole che indicherà quale libreria è il colpevole.
Antimonit,

15
L'uso di una versione obsoleta della libreria non è una soluzione.
Andrew Koster,

5
È ancora il caso di Kotlin 1.3.70?
IgorGanapolsky,

2
Sto usando Kotlin 1.3.72 e devo ancora affrontare questo problema?
Anbuselvan Rocky,

4
Sto affrontando anche questo problema 1.3.72, qualche soluzione ragazzi?
hiashutoshsingh

174

Aggiungi questa riga a te gradle.properties:

kapt.incremental.apt=true

11
Questa è un'opzione migliore della risposta accettata. Per coloro che hanno bisogno di capire e ottenere maggiori dettagli, consultare questo link: medium.com/avast-engineering/…
Abhimanyu

4
fallito anche per me.
Steven Smith,

Qualcuno è il motivo per cui sta accadendo qui?
Omer,

Di recente ho abilitato l'associazione dei dati al mio progetto Android (Kotlin) e ho iniziato a ricevere questo avviso. L'aggiunta della proprietà come indicato sopra ha funzionato per me. Anche usando le ultime versioni di tutto, ad esempio tutte le dipendenze, i compilatori, gli strumenti di compilazione, gli SDK, ecc.
Gail

4
In questo modo, non ha funzionato per me. Ho anche dovuto modificare il mio file build.gradle come descritto nella documentazione per la libreria Room .
Nelson Ferragut,

121

Il vero problema è che l'elaborazione incrementale rende le cose più veloci, ma se uno qualsiasi dei processori di annotazione non è incrementale, nessuno di questi verrà effettivamente elaborato in quel modo.

Qual è lo scopo dell'elaborazione incrementale?

Dalla versione 1.3.30+ , l'elaborazione incrementale ha permesso di non rielaborare completamente i moduli ogni volta che si verifica una modifica, offrendo al processo di generazione prestazioni migliori:

Le principali aree di interesse di questa versione sono state le prestazioni di Kotlin / Native, KAPT e i miglioramenti di IntelliJ IDEA.

Dalla documentazione di Kotlin :

I processori di annotazione (vedi JSR 269) sono supportati in Kotlin con il plugin del compilatore kapt. In poche parole, puoi usare librerie come Dagger o Data Binding nei tuoi progetti Kotlin.

Come risolvere l'elaborazione incrementale della stanza?

E il processore di annotazione incrementale della stanza è disabilitato per impostazione predefinita. Questo è un problema noto ed è descritto qui . Intendono risolverlo sulla versione 2.2.0. Puoi semplicemente attendere l'aggiornamento o puoi abilitarlo per eliminare l'avviso impostando:

nel file gradle.properties :

kapt.incremental.apt=true

(passaggi opzionali)

per consentire che la banca dati sia incrementale:

android.databinding.incremental=true

per build più veloci:

kapt.use.worker.api=true

se vengono apportate solo alcune modifiche, il tempo di costruzione diminuisce notevolmente:

kapt.include.compile.classpath=false

(torna all'argomento)

nel progetto build.gradle , aggiungi le dipendenze necessarie (Groovy):

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

e

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

Versione DSL di Kotlin:

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

e

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

Modificare:

9 ottobre 2019

androidx.room:room-*:2.2.0 è stato rilasciato .

Processore di annotazione incrementale Gradle: Room è ora un processore di annotazione con isolamento Gradle e la incrementabilità può essere abilitata tramite l'opzione del processore room.incremental.


8
Questo dovrebbe essere accettato come kapt.incremental.apt = true è qualcosa che mancherà quando includerai Room nel tuo progetto. Quello non è nemmeno menzionato nei documenti Android per Room
sela

1
Questa risposta mi ha aiutato mentre stavo usando androidx.lifecycle:lifecycle-extensionsnella versione 2.1.0 e dopo essere passato alla 2.2.0-beta01 l'avvertimento è andato via!
simne7

2
@ simne7 controlla la mia modifica alla fine. viene rilasciata la versione 2.2.0 =) è già possibile aggiornarla per accedere alla funzione di elaborazione incrementale e migliorare la propria build.
Dimas Mendes,

L'abilitazione lo android.buildcache=truerenderebbe più veloce?
IgorGanapolsky,

1
@IgorGanapolsky secondo Google sviluppatori di siti web, Projects using Android plugin 2.3.0 and higher enable the build cache by default (unless you explicitly disable the build cache). Quindi non ha senso abilitarlo in quanto è abilitato per impostazione predefinita.
Dimas Mendes,

37

Dalla documentazione della camera :

"Room ha le seguenti opzioni del processore di annotazione ... room.incremental: abilita il promotore di annotazione incrementale Gradle."

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

Assicurati di aggiornare la versione della stanza a 2.2.xo successive.


3
Rispondere correttamente alle persone, se si desidera mantenere l'elaborazione incrementale. Potresti non aver bisogno degli argomenti schemaLocation o expandProjection impostati sopra. room.incremental suffice.
bajicdusko,

1
Secondo developer.android.com/jetpack/androidx/releases/room , esiste ancora la versione 2.2.0-rc01.
CoolMind,


Aggiorna la versione della camera alla 2.2.0 che ha funzionato per me
DivideBy0

25

Ecco un elenco di cose che puoi fare per risolvere questo problema e ridurre significativamente i tempi di compilazione mentre ci sei.

Nel tuo build.gradlefile (modulo):

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

Nel tuo gradle.propertiesfile:

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

Abilita richiesta di elaborazione annotazione incrementale Kapt

Usa Kotlin 1.3.31 o Kotlin 1.3.30 più recente rilasciato

Nel file gradle.properties del progetto Android Kotlin

# 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

Che dire android.lifecycleProcessor.incremental=true?
IgorGanapolsky,

10

Molte delle altre risposte qui coprono l'errore o disabilitano l'elaborazione incrementale invece di farlo effettivamente funzionare nel modo desiderato.

È possibile abilitare l'elaborazione incrementale per la libreria specifica nel gradle.propertiesfile. Basta aggiungere queste impostazioni, o qualunque corrisponda alla libreria che genera l'errore:

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

2
Non ne sono così sicuro android.lifecycleProcessor.incremental=true, non sembra essere documentato da nessuna parte
Daniel Wilson,

Nemmeno io ne sono sicuro, ma l'ho provato su un'intuizione e il compilatore ha smesso di dirmi che la libreria processecycleProcessor non aveva abilitato l'elaborazione incrementale.
Jacques.S,

5

Se si lamenta che "È richiesta l'elaborazione incrementale delle annotazioni, ma il supporto è disabilitato perché i seguenti processori non sono incrementali", impostare "kapt.incremental.apt" su "true" (indicato in una risposta diversa) in gradle.properties è contro- intuitivo. Devi impostarlo su "false". Che ha fatto per me.


1
Questo ha funzionato davvero. Impostalo su FALSE! grazie
Sakiboy,

E cosa succederà? Si compilerà più velocemente o semplicemente nasconderà l'avviso?
CoolMind,

@CoolMind Disabiliteresti l'elaborazione incrementale delle annotazioni, cosa che comunque non accadrà se nessuna delle tue dipendenze non la supporta. Quindi, l'avviso scompare e non vi è stato alcun cambiamento nel processo di generazione da prima.
DC Christopher,

2
L'impostazione sorprendente kapt.incremental.apt=falsemi ha aiutato, non ho più avuto l'errore
Rakhi Dhavale,

2
Non hai più errori ma ora non hai elaborazioni incrementali :)
JustAnotherCoder

2

Sto usando AndroidX , ma suppongo sia lo stesso per android.arch.lifecycle. Per me ha semplicemente aiutato a sostituire questo:

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

... con questo:

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

Quindi, se lo stai usando android.arch.lifecycle, potrebbe avere lo stesso effetto sostituendolo:

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

... con questo:

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

Ricorda che questo funziona solo se stai usando Java 8 e che dovresti anche rimuovere le OnLifecycleEventannotazioni per le LifecycleObserverclassi e lasciare DefaultLifecycleObserverinvece implementare quegli osservatori .

La modifica a questo metodo è consigliata anche nelle build.gradledipendenze mostrate qui .


Perché ti stai sbarazzando di kapt?
IgorGanapolsky,

@IgorGanapolsky Questo è ciò che viene suggerito dal ciclo di vita di AndroidX se si utilizza Java 8. Vedi di più qui: developer.android.com/jetpack/androidx/releases/…
Anigif

kaptè essenziale per Kotlin
IgorGanapolsky il

1
Solo se la lib lo richiede. Secondo questa pagina le annotazioni saranno deprecate quando Java 8 diventerà più mainstream su Android, quindi raccomandano common-java8se possibile: developer.android.com/reference/androidx/lifecycle/Lifecycle
Anigif

Interessante. Non menzionano kaptin particolare però ...
IgorGanapolsky il

2

Quello che dovresti davvero fare è implementare queste righe di codice nel tuo buildConfigtag nella tua build.gradleapp del modulo:

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

0

Risposte di cui sopra possono essere utili, ma quello che mi ha aiutato è la riduzione del kotlin_versionin build.gradle(Project)a1.3.41 e costruzione del progetto. Questo ti permetterà di vedere se c'è qualche problema con il tuo modello di entità.

Il mio era, mi sono dimenticato di annotare @PrimaryKey. Il tuo potrebbe essere qualcosa di diverso. Kotlin 1.3.41permette di vedere quei problemi. Risolvi questi problemi e ripristina il tuo kotlin_versionprecedente.


-1

Ciò può anche essere causato da problemi di carattere come " © " sul lato del database quando la lingua del sistema è una lingua non inglese. In tal caso, l'utilizzo della lingua del sistema informatico in inglese risolverà il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.