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


150

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

为什么您的commentProcessor被评论?您是否尝试取消注释,然后构建项目?(适用于房间和生命周期)
FerhatErgün19年

1
尝试添加android.enableSeparateAnnotationProcessing =在gradle.properities真正reddit.com/r/androiddev/comments/ai92pt/...这个发现,它可能与你的问题
Ferhat额尔古纳

7
您可以暂时将项目build.gradle文件中的kotlin-gradle-plugin降级到1.3.41版本。我认为这是与kapt相关的错误。更多信息:youtrack.jetbrains.com/issue/KT-33515
Necrontyr

4
您也可以在libs / <您的模块名称>中创建gradle.properties文件,kapt.incremental.apt=false如问题中所述,解决方法也是如此。它为我工作。
Necrontyr

2
@Necrontyr,您的建议确实可行。非常感谢
Shax

Answers:


80

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


71
@Necrontyr提到的错误与警告无关。该警告实际上是有意的,降至1.3.41只是隐藏了警告,但问题仍然存在,甚至还算不错。人们可能会认为,由于他们启用了增量批注处理,因此可以使处理速度更快。但是事实是,如果没有任何注释处理器不是增量处理器,则不会对它们进行增量处理。这是一个友好的提醒,指出了什么是罪魁祸首。
Antimonit

15
使用过时的库版本不是解决方案。
Andrew Koster

5
Kotlin还是这样1.3.70吗?
IgorGanapolsky

2
我正在使用Kotlin 1.3.72,仍然遇到此问题吗?
Anbuselvan Rocky

4
我也面对这个问题1.3.72任何解决方案的家伙?
hiashutoshsingh

174

只需将这一行添加到您的gradle.properties中:

kapt.incremental.apt=true

11
这是公认的答案更好的选择。对于那些需要了解和了解更多详细信息的人,请参考以下链接:medium.com/avast-engineering/…–
Abhimanyu

4
我也失败了
史蒂芬·史密斯,

有人在这里发生它的原因是什么?
Omer

我最近启用了将数据绑定到我的android(kotlin)项目的功能,并开始收到此警告。如上所述添加属性对我有用。同时利用一切的最新版本,例如,所有的依赖关系,编译器,生成工具,软件开发工具包,等等
盖尔

4
这样做,对我没有用。我还必须按照Room库文档中的说明编辑build.gradle文件。
纳尔逊·菲拉格特

121

真正的问题是增量处理可以使处理速度更快,但是如果任何注释处理器不是增量处理器,则实际上不会以这种方式处理它们。

增量处理的目的是什么?

1.3.30+版本开始,增量处理允许模块在每次发生更改时不再被完全处理,从而使构建过程具有更好的性能:

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

Kotlin文档中

带有kapt编译器插件的Kotlin支持注释处理器(请参阅JSR 269)。简而言之,您可以在Kotlin项目中使用Dagger或Data Binding之类的库。

如何解决房间增量处理?

默认情况下,Room增量注释处理器是禁用的。这是一个已知问题,在此进行描述。他们打算在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启用可增量性。


8
应该接受这一点,因为kapt.incremental.apt = true是在项目中包含Room时会丢失的东西。在Room的
sela,

1
当我androidx.lifecycle:lifecycle-extensions在版本2.1.0 中使用时,此答案对我有所帮助,切换到2.2.0-beta01后,警告消失了!
simne7

2
@ simne7最后检查我的编辑。2.2.0版已发布=)您可以对其进行升级,以访问增量处理功能并增强构建。
Dimas Mendes

启用android.buildcache=true会更快吗?
IgorGanapolsky

1
@IgorGanapolsky(根据Google Developers网站,)Projects using Android plugin 2.3.0 and higher enable the build cache by default (unless you explicitly disable the build cache)。因此启用它没有任何意义,因为默认情况下已启用它。
Dimas Mendes

37

会议室文件

“房间具有以下注释处理器选项... 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参数。房间。增量就足够了。
bajicdusko

1
根据developer.android.com/jetpack/androidx/releases/room,仍然有2.2.0-rc01版本。
CoolMind


将房间版本更新为2.2.0,这对我
有用

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发布

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

10

此处的许多其他答案掩盖了错误或禁用了增量处理,而不是按照您想要的方式使其真正起作用。

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

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

2
我不太确定android.lifecycleProcessor.incremental=true,似乎什么地方也没有记录
Daniel Wilson

我也不确定,但是我直觉上尝试了一下,编译器停止告诉我lifecycleProcessor库没有启用增量处理。
雅克·S,

5

如果抱怨“请求增量注释处理,但由于以下处理器不是增量处理器而禁用了支持”,则在gradle.properties中将“ kapt.incremental.apt”设置为“ true”(在不同的答案中提到)是反作用的。直观。您需要将其设置为“ false”。对我来说就做到了。


1
这确实有效。将其设置为FALSE人员!谢谢
Sakiboy

会发生什么?它会编译得更快还是仅仅隐藏警告?
CoolMind

@CoolMind您将禁用增量批注处理,如果您的任何依赖项不支持它,则无论如何都不会发生。因此,警告消失了,构建过程也没有任何变化。
DC Christopher

2
令人惊讶的是设置kapt.incremental.apt=false对我有所帮助,我再也没有得到错误
Rakhi Dhavale

2
您没有更多的错误,但是现在您没有增量处理了:)
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所示depencies 这里


你为什么要摆脱kapt
IgorGanapolsky

@IgorGanapolsky这就是由AndroidX生命周期建议,如果你在这里多使用Java 8.请参阅:developer.android.com/jetpack/androidx/releases/...
Anigif

kapt对Kotlin至关重要
IgorGanapolsky

1
仅在lib要求时。根据此页面的说明,一旦Java 8在Android上变得更加主流,注释将被弃用,因此,common-java8如果可能,它们建议:developer.android.com/reference/androidx/lifecycle/Lifecycle
Anigif

有趣。他们没有kapt特别提及...
IgorGanapolsky

2

您真正应该做的是buildConfigbuild.gradle模块应用中的代码中实现以下代码行:

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

0

以上答案可能是有用的,但什么帮我减的是kotlin_versionbuild.gradle(Project)1.3.41和建设项目。这将使您查看您的实体模型是否存在任何问题。

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


-1

当系统语言是非英语语言时,这也可能是由字符问题引起的,例如数据绑定方面的“ İ ” 。在这种情况下,使用英语的计算机系统语言可以解决该问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.