¿Cómo deshacerse de la anotación incremental procesando la advertencia solicitada?

150

Acabo de comenzar a usar el desarrollo de Android y tratar de usar la biblioteca de habitaciones. Desde ayer me enfrento a este mensaje de advertencia

w: [kapt] Procesamiento de anotación incremental solicitado, pero el soporte está deshabilitado porque los siguientes procesadores no son incrementales: androidx.lifecycle.LifecycleProcessor (NON_INCREMENTAL), androidx.room.RoomProcessor (NON_INCREMENTAL).

He intentado investigar y solucionar, pero no puedo evitar este error, aquí está mi archivo grale.build. sugiera / aconseje lo que estoy haciendo mal.

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
fuente
¿Por qué se comenta tu procesador de anotación? ¿Intentaste descomentarlos y luego construir el proyecto? (tanto para la habitación como para el ciclo de vida)
Ferhat Ergün
1
intente agregar android.enableSeparateAnnotationProcessing = true en su gradle.properities reddit.com/r/androiddev/comments/ai92pt/… encontrado en esto, podría estar relacionado con su problema
Ferhat Ergün
77
Puede degradar kotlin-gradle-plugin en el archivo build.gradle de su proyecto a la versión 1.3.41 por el momento. Creo que es un error relacionado con Kapt. Más información: youtrack.jetbrains.com/issue/KT-33515
Necrontyr
55
También puede crear un archivo gradle.properties en libs / <nombre de su módulo> con kapt.incremental.apt=falsetambién como se describe en el problema como una solución alternativa. Funcionó para mi.
Necrontyr
2
@Necrontyr, su sugerencia realmente funcionó. Muchas gracias
Shax

Respuestas:

80

Hay un error en la versión kotlin-gradle-plugin de 1.3.50 como se menciona en @Necrontyr. Simplemente baje la versión de kotlin_version en build.gradle (Project) a 1.3.41.

Mücahid Kambur
fuente
71
El error mencionado por @Necrontyr no está relacionado con la advertencia. La advertencia en realidad está destinada y bajar a 1.3.41 solo oculta la advertencia, pero el problema sigue siendo el mismo, si no peor. La gente podría pensar que debido a que activaron el procesamiento de anotaciones incrementales, las cosas se acelerarán. Pero la verdad es que si alguno de los procesadores de anotaciones no es incremental, ninguno de ellos se procesará de forma incremental. Este es un recordatorio amigable que señalará qué biblioteca es la culpable.
Antimonit
15
Usar una versión de biblioteca desactualizada no es una solución.
Andrew Koster,
55
¿Sigue siendo el caso con Kotlin 1.3.70?
IgorGanapolsky
2
Estoy usando Kotlin 1.3.72 y todavía enfrento este problema.
Anbuselvan Rocky
44
También estoy enfrentando este problema 1.3.72 ¿alguna solución, chicos?
hiashutoshsingh
174

Simplemente agregue esta línea a gradle.properties:

kapt.incremental.apt=true
Ali Ahmed
fuente
11
Esta es una mejor opción que la respuesta aceptada. Para aquellos que necesitan entender y entrar en más detalles, consulte este enlace: medium.com/avast-engineering/…
Abhimanyu
44
Faild para mí también.
Steven Smith
¿Alguien es la razón por la que está sucediendo aquí?
Omer
Recientemente habilité el enlace de datos a mi proyecto de Android (Kotlin) y comencé a recibir esta advertencia. Agregar la propiedad como se indicó anteriormente funcionó para mí. También se utilizan las últimas versiones de todo, por ejemplo, todas las dependencias, compiladores, herramientas de compilación, SDK, etc.
Gail
44
Hacer esto no funcionó para mí. También tuve que editar mi archivo build.gradle como se describe en la documentación de la biblioteca de la sala .
Nelson Ferragut
121

El verdadero problema es que el procesamiento incremental hace que las cosas sean más rápidas, pero si alguno de los procesadores de anotaciones no es incremental, ninguno de ellos se procesará realmente de esa manera.

¿Cuál es el propósito del procesamiento incremental?

A partir de la versión 1.3.30+ , el procesamiento incremental permitió que los módulos no se procesen por completo nuevamente cada vez que se produce un cambio, lo que le da al proceso de compilación un mejor rendimiento:

Las principales áreas de enfoque para esta versión se han centrado en Kotlin / Native, el rendimiento de KAPT, así como las mejoras para IntelliJ IDEA.

De la documentación de Kotlin :

Los procesadores de anotaciones (ver JSR 269) son compatibles con Kotlin con el complemento compilador kapt. En pocas palabras, puede usar bibliotecas como Dagger o Data Binding en sus proyectos de Kotlin.

¿Cómo arreglar el procesamiento incremental de la sala?

Y el procesador de anotación incremental Room está deshabilitado de forma predeterminada. Este es un problema conocido y se describe aquí . Tienen la intención de arreglarlo en la versión 2.2.0. Puede esperar la actualización o habilitarla para deshacerse de la advertencia configurando:

en el archivo gradle.properties :

kapt.incremental.apt=true

(pasos opcionales)

para permitir que el enlace de datos sea ​​incremental:

android.databinding.incremental=true

para construcciones más rápidas:

kapt.use.worker.api=true

Si solo se realizan algunos cambios, el tiempo de construcción disminuye considerablemente:

kapt.include.compile.classpath=false

(volver al tema)

en su proyecto build.gradle , agregue las dependencias necesarias (Groovy):

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

y

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

Versión Kotlin DSL:

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

y

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

Editar:

9 de octubre de 2019

se lanza androidx.room:room-*:2.2.0 .

Procesador de anotación incremental Gradle: Room ahora es un procesador de anotación de aislamiento Gradle y la capacidad de incremento se puede habilitar a través de la opción de procesador room.incremental.

Dimas Mendes
fuente
8
Este debe ser aceptado como kapt.incremental.apt = true es algo que faltará al incluir Room en su proyecto. Ese ni siquiera se menciona en los documentos de Android para Room
sela
1
¡Esta respuesta me ayudó cuando estaba usando la androidx.lifecycle:lifecycle-extensionsversión 2.1.0 y después de cambiar a 2.2.0-beta01 la advertencia desapareció!
simne7
2
@ simne7 mira mi edición al final. se lanza la versión 2.2.0 =) ya puede actualizarla para acceder a la función de procesamiento incremental y aumentar su compilación.
Dimas Mendes
¿Habilitarlo lo android.buildcache=trueharía más rápido?
IgorGanapolsky
1
@IgorGanapolsky según Google desarrolladores de sitios web, Projects using Android plugin 2.3.0 and higher enable the build cache by default (unless you explicitly disable the build cache). Por lo tanto, no tiene sentido habilitarlo, ya que está habilitado de forma predeterminada.
Dimas Mendes
37

De la documentación de la sala :

"Room tiene las siguientes opciones de procesador de anotación ... room.incremental: habilita el procesador de anotación incremental Gradle".

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

Asegúrese de actualizar la versión de la sala a 2.2.xo superior.

Alberto Gaona
fuente
3
Responda correctamente a las personas, si desea mantener el procesamiento incremental. Es posible que no necesite los argumentos schemaLocation o expandProjection establecidos anteriormente. Habitación. Suficiente incremental.
bajicdusko
1
De acuerdo con developer.android.com/jetpack/androidx/releases/room , todavía hay una versión 2.2.0-rc01.
CoolMind
1
ya está disponible -> developer.android.com/jetpack/androidx/releases/…
jesses.co.tt
Actualice la versión de la sala a 2.2.0, esto funcionó para mí
DivideBy0
25

Aquí hay una lista de cosas que puede hacer para solucionar esto y disminuir significativamente los tiempos de construcción mientras lo hace.

En su build.gradlearchivo (módulo):

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

En tu gradle.propertiesarchivo:

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
fuente
18

Habilitar Kapt Solicitud de procesamiento de anotaciones incrementales

Utilice Kotlin 1.3.31 o una versión más reciente de Kotlin 1.3.30

En su proyecto de Android Kotlin, el archivo 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
Shomu
fuente
¿Qué hay de android.lifecycleProcessor.incremental=true?
IgorGanapolsky
10

Muchas de las otras respuestas aquí cubren el error o deshabilitan el procesamiento incremental en lugar de hacerlo funcionar de la manera deseada.

Puede habilitar el procesamiento incremental para su biblioteca específica en el gradle.propertiesarchivo. Simplemente agregue esta configuración, o la que coincida con la biblioteca que arroja el error:

android.databinding.incremental=true
android.lifecycleProcessor.incremental=true
Jacques.S
fuente
2
No estoy tan seguro android.lifecycleProcessor.incremental=true, no parece estar documentado en ninguna parte
Daniel Wilson
Tampoco estoy seguro, pero lo probé con una corazonada y el compilador dejó de decirme que la biblioteca lifecycleProcessor no tenía habilitado el procesamiento incremental.
Jacques.S
5

Si se queja de que "Se solicitó el procesamiento de anotaciones incrementales, pero el soporte está deshabilitado porque los siguientes procesadores no son incrementales", entonces establecer "kapt.incremental.apt" en "verdadero" (mencionado en una respuesta diferente) en gradle.properties es counter- intuitivo. Debe establecerlo en "falso". Eso lo hizo por mí.

DC Christopher
fuente
1
Esto realmente funcionó. ¡Configúralo para personas FALSAS! gracias
Sakiboy
Y que pasara? ¿Se compilará más rápido o simplemente ocultará la advertencia?
CoolMind
@CoolMind Deshabilitaría el procesamiento de anotaciones incrementales, algo que de todos modos no sucederá si alguna de sus dependencias no lo admite. Entonces, la advertencia desaparece y no hay cambios en el proceso de compilación de antes.
DC Christopher
2
Sorprendentemente, la configuración kapt.incremental.apt=falseme ayudó, ya no recibo el error
Rakhi Dhavale
2
No tiene más errores pero ahora no tiene procesamiento incremental :)
JustAnotherCoder
2

Estoy usando AndroidX , pero supongo que es lo mismo android.arch.lifecycle. Para mí, simplemente ayudó a reemplazar esto:

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

... con este:

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

Entonces, si lo está usando android.arch.lifecycle, podría tener el mismo efecto reemplazando esto:

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

... con este:

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

Tenga en cuenta que esto solo funciona si está utilizando Java 8 y que también debe eliminar las OnLifecycleEventanotaciones para las LifecycleObserverclases y dejar que esos observadores implementenDefaultLifecycleObserver lugar.

También se recomienda cambiar a este método en las build.gradledependencias que se muestran aquí .

Anigif
fuente
¿Por qué te estás deshaciendo kapt?
IgorGanapolsky
@IgorGanapolsky Eso es lo que sugiere el ciclo de vida de AndroidX si está utilizando Java 8. Vea más aquí: developer.android.com/jetpack/androidx/releases/…
Anigif
kaptes esencial para Kotlin
IgorGanapolsky
1
Solo si la lib lo requiere. De acuerdo con esta página, las anotaciones quedarán en desuso una vez que Java 8 se generalice en Android, por lo que recomiendan, common-java8si es posible: developer.android.com/reference/androidx/lifecycle/Lifecycle
Anigif
Interesante. Sin kaptembargo, no mencionan en particular ...
IgorGanapolsky
2

Lo que realmente debe hacer es implementar estas líneas de código en su buildConfigetiqueta en su build.gradleaplicación de módulo:

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

Respuestas anteriores pueden ser útiles, pero lo que me ayudó es reducir el kotlin_versionen build.gradle(Project)a1.3.41 , y la construcción del proyecto. Esto le permitirá ver si hay algún problema con su modelo de entidad.

El mío fue, olvidé anotar @PrimaryKey. Tu puede ser algo diferente. Kotlin 1.3.41permite ver esos problemas. Solucione esos problemas y vuelva a su kotlin_versionanterior.

Sourav Roy
fuente
-1

Esto también puede ser causado por problemas de caracteres como " İ " en el lado de enlace de datos cuando el idioma del sistema no es inglés. En tal caso, el uso del idioma del sistema informático en inglés resolverá el problema.

Hasan Kucuk
fuente