如何摆脱增量注释处理请求的警告?

Posted

技术标签:

【中文标题】如何摆脱增量注释处理请求的警告?【英文标题】:How to get rid of Incremental annotation processing requested warning? 【发布时间】:2019-12-31 09:20:09 【问题描述】:

我刚刚开始使用 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'

【问题讨论】:

为什么你的 annotationProcessor 被评论了?您是否尝试取消注释它们然后构建项目? (适用于房间和生命周期) 尝试在你的 gradle.properities 中添加 android.enableSeparateAnnotationProcessing=true reddit.com/r/androiddev/comments/ai92pt/… ,这可能与你的问题有关 您可以暂时将项目 build.gradle 文件中的 kotlin-gradle-plugin 降级到 1.3.41 版本。我认为这是与 kapt 相关的错误。更多信息:youtrack.jetbrains.com/issue/KT-33515 您也可以使用kapt.incremental.apt=false 在 libs/ 中创建一个 gradle.properties 文件,如问题中所述作为解决方法。它对我有用。 @Necrontyr,你的建议真的奏效了。非常感谢 【参考方案1】:

只需将此行添加到您的 gradle.properties:

kapt.incremental.apt=true

【讨论】:

这是一个比接受的答案更好的选择。需要了解和深入了解的朋友可以参考这个链接:medium.com/avast-engineering/… 我也失败了。 有人在这里发生的原因是什么? 我最近启用了数据绑定到我的 android (kotlin) 项目并开始收到此警告。如上所述添加属性对我有用。还使用所有内容的最新版本,例如所有依赖项、编译器、构建工具、SDK 等 这样做对我不起作用。我还必须按照documentation for the Room library 中的说明编辑我的 build.gradle 文件。【参考方案2】:

真正的问题是增量处理使事情变得更快,但如果任何注释处理器是非增量的,它们都不会以这种方式实际处理。

增量处理的目的是什么?

从version 1.3.30+ 开始,增量处理允许在每次发生更改时不再完全处理模块,从而为构建过程提供更好的性能:

此版本的主要关注领域是 Kotlin/Native、KAPT 性能以及 IntelliJ 的改进 想法。

来自Kotlin documentation:

Kotlin 支持注释处理器(参见 JSR 269) kapt 编译器插件。简而言之,您可以使用诸如 Kotlin 项目中的 Dagger 或数据绑定。

如何修复房间增量处理?

房间增量注释处理器默认禁用。这是一个已知问题,描述为here。他们打算在 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")
            
        
     

2019 年 10 月 9 日

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

Gradle 增量注释处理器:Room 现在是 Gradle 隔离注释处理器和可增量性可以通过 处理器选项 room.incremental。

最新更新:

对于最新的 Kotlin DSL 版本,请使用

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

【讨论】:

这个应该被接受,因为 kapt.incremental.apt=true 是在你的项目中包含 Room 时会丢失的东西。在Room的Android 文档中甚至都没有提到这一点 这个答案对我有帮助,因为我在 2.1.0 版本中使用 androidx.lifecycle:lifecycle-extensions,在切换到 2.2.0-beta01 后警告消失了! @simne7 最后查看我的编辑。版本 2.2.0 已发布 =) 您可以升级它以访问增量处理功能并提升您的构建。 启用android.buildcache=true 会使其更快吗? @IgorGanapolsky 根据谷歌开发者网站,Projects using Android plugin 2.3.0 and higher enable the build cache by default (unless you explicitly disable the build cache)。所以启用它是没有意义的,因为它是默认启用的。【参考方案3】:

@Necrontyr 提到的 1.3.50 的 kotlin-gradle-plugin 版本中存在一个错误。只需将 build.gradle(Project) 中的 kotlin_version 降级到 1.3.41 即可。

【讨论】:

@Necrontyr 提到的错误与警告无关。该警告实际上是有意的,并且下降到 1.3.41 只是隐藏了警告,但问题保持不变,如果不是更糟的话。人们可能会认为,因为他们打开了增量注释处理,它会让事情变得更快。但事实是,如果任何注释处理器不是增量的,那么它们都不会被增量处理。这是一个友好的提醒,将指出哪个图书馆是罪魁祸首。 使用过时的库版本不是解决方案。 Kotlin 1.3.70 还是这样吗? 我正在使用 Kotlin 1.3.72 仍然遇到这个问题? 我也面临这个问题 1.3.72 有什么解决方案吗?【参考方案4】:

来自Room documentation:

“Room 具有以下注释处理器选项...room.incremental:启用 Gradle 增量注释处理器。”

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

请务必将房间版本更新到 2.2.x 或更高版本。

【讨论】:

正确答案的人,如果你想保持增量处理。您可能不需要上面设置的 schemaLocation 或 expandProjection 参数。 room.incremental 就足够了。 根据developer.android.com/jetpack/androidx/releases/room,还有2.2.0-rc01版本。 现在发布 --> developer.android.com/jetpack/androidx/releases/… 将房间版本更新到 2.2.0 这对我有用【参考方案5】:

启用 Kapt 增量注释处理请求

使用 Kotlin 1.3.31 或更新版本 Kotlin 1.3.30 released

在你的 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 呢?【参考方案6】:

这里列出了您可以采取的措施来解决此问题并显着减少构建时间。

在您的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 

【讨论】:

【参考方案7】:

这里的许多其他答案都掩盖了错误或禁用增量处理,而不是实际使其按您想要的方式工作。

您可以在gradle.properties 文件中为您的特定库启用增量处理。只需添加这些设置,或者与引发错误的库匹配的任何一个:

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

【讨论】:

我不太确定android.lifecycleProcessor.incremental=true,它似乎没有记录在任何地方 我也不确定,但我凭直觉试了一下,编译器停止告诉我生命周期处理器库没有启用增量处理。【参考方案8】:

如果它抱怨“请求增量注释处理,但支持被禁用,因为以下处理器不是增量的”,那么在 gradle.properties 中将“kapt.incremental.apt”设置为“true”(在不同的答案中提到)是违反直觉的。您需要将其设置为“假”。这对我有用。

【讨论】:

这确实有效。将其设置为 FALSE 人!谢谢 接下来会发生什么?它会编译得更快还是只是隐藏警告? @CoolMind 您将禁用增量注释处理,如果您的任何依赖项不支持它,无论如何都不会发生这种情况。因此,警告消失了,构建过程与之前没有任何变化。 令人惊讶的设置 kapt.incremental.apt=false 帮助了我,我不再收到错误 你没有更多错误但现在你没有增量处理:)【参考方案9】:

你真正应该做的是在你的buildConfig标签中实现这些代码行在你的build.gradle,模块app:

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

【讨论】:

【参考方案10】:

我正在使用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 时有效,并且您还应该删除 LifecycleObserver 类的 OnLifecycleEvent 注释,并让这些观察者实现 DefaultLifecycleObserver

build.gradle 显示的here 依赖项中也建议更改为此方法。

【讨论】:

你为什么要摆脱kapt @IgorGanapolsky 如果您使用 Java 8,这就是 AndroidX 生命周期所建议的内容。在此处查看更多信息:developer.android.com/jetpack/androidx/releases/… kapt 对于 Kotlin 来说是必不可少的 仅当库需要它时。根据此页面,一旦 Java 8 在 Android 上成为主流,注释将被弃用,因此如果可能,他们推荐common-java8:developer.android.com/reference/androidx/lifecycle/Lifecycle 有趣。他们没有特别提到kapt...【参考方案11】:

以上答案可能很有用,但对我有帮助的是将build.gradle(Project) 中的kotlin_version 减少到1.3.41 并构建项目。这将允许您查看您的实体模型是否存在任何问题。

我的是,我忘了注释@PrimaryKey。你的可能会有所不同。 Kotlin 1.3.41 允许查看这些问题。解决这些问题并将您的 kotlin_version 恢复为上一个。

【讨论】:

【参考方案12】:

从 1.3.30 版本开始,kapt 支持增量注释处理作为实验性功能。然而,从 1.3.50 版本开始,增量注释处理默认启用

因此,如果您的 kapt 版本大于或等于 1.3.30 且低于 1.3.50,则必须将 kapt.incremental.apt=true 行添加到您的 gradle.properties 文件以启用增量注释处理。否则;您不必将kapt.incremental.apt 设置为true 即可启用它。不过,如果您愿意,您可以将其设置为 false 以禁用它。

除此之外; 增量注释处理也需要启用增量编译。因此,您必须将 kotlin.incremental=true 行添加到您的 gradle.properties 文件中才能受益于增量注释处理功能。

请注意,从 2.3.0-alpha02 版本开始,Room 的增量注释处理选项默认开启。这意味着如果您的库版本大于或等于此值,则不必将 room.incremental 参数设置为 true。要了解更多信息,请参阅issue #112110217。

另请注意,如果您使用的是 Android Gradle 插件 3.6.x 或更高版本,增量注释处理选项默认为开启用于数据绑定。因此,您不必将 android.databinding.incremental=true 行添加到您的 gradle.properties 文件中。要了解更多信息,请参阅issue #110061530。

【讨论】:

【参考方案13】:

这也可能是由字符问题引起的,例如当系统语言为非英语语言时,databinding 端的“İ”。在这种情况下,使用英语的计算机系统语言就可以解决问题。

【讨论】:

【参考方案14】:

对我来说,当我的实体具有主键和 @NonNull 注释,但类型字段仍使用可为空 (?) 时,就会发生这种情况。所以,去掉这个?,问题就解决了

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

【讨论】:

以上是关于如何摆脱增量注释处理请求的警告?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript增量(++)警告[重复]

Android DataBinding KAPT 增量支持

警告为错误 - 如何摆脱这些

如何进行 OLAP 多维数据集增量处理?

如何摆脱警告:PWC4011:无法将请求字符编码设置为 UTF-8

HDFS--增量块汇报[IBR]