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'
}
@Necrontyrが述べたように、kotlin-gradle-pluginバージョン1.3.50にバグがあります。 build.gradle(Project)のkotlin_versionを1.3.41にダウングレードするだけです。
Gradle.propertiesに次の行を追加するだけです:
kapt.incremental.apt=true
本当の問題は、インクリメンタル処理が物事を高速化することですが、アノテーションプロセッサのいずれかが非インクリメンタルである場合、それらのどれも実際にはそのように処理されません。
インクリメンタル処理の目的は何ですか?
バージョン1.3.30 + から、インクリメンタル処理により、変更が発生するたびにモジュールが再び完全に処理されなくなり、ビルドプロセスのパフォーマンスが向上しました。
このリリースの主な重点分野は、Kotlin/Native、KAPTパフォーマンス、およびIntelliJ IDEAの改善です。
注釈プロセッサ(JSR 269を参照)は、kaptコンパイラプラグインを使用してKotlinでサポートされています。一言で言えば、KotlinプロジェクトでDaggerやData Bindingなどのライブラリを使用できます。
部屋のインクリメンタル処理を修正するには?
ルーム増分注釈プロセッサは、デフォルトでdisabledです。これは既知の問題であり、 here と説明されています。彼らはバージョン2.2.0でそれを修正するつもりです。更新を待つか、それを有効にして警告を取り除くことができます:
gradle.propertiesファイル内:
kapt.incremental.apt=true
(オプションの手順)
databindingをインクリメンタルにするには:
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 リリース済み 。
Gradle Incremental Annotation Processor:Roomは、Gradleを隔離する注釈プロセッサになり、プロセッサオプションroom.incrementalを介してインクリメント可能にすることができます。
会議室のドキュメント から:
「Roomには次の注釈プロセッサオプションがあります... room.incremental:Gradle増分注釈プロセッサを有効にします。」
Android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [
"room.schemaLocation":"$projectDir/schemas".toString(),
"room.incremental":"true",
"room.expandProjection":"true"]
}
}
}
}
必ず部屋のバージョンを2.2.x以降に更新してください。
これを修正し、ビルド中のビルド時間を大幅に短縮するためにできることのリストを以下に示します。
あなたの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
ここでのその他の回答の多くは、エラーを隠したり、実際に希望どおりに動作させるのではなく、増分処理を無効にしたりします。
gradle.properties
ファイルで特定のライブラリの増分処理を有効にできます。これらの設定を追加するか、エラーをスローするライブラリに一致する設定を追加します。
Android.databinding.incremental=true
Android.lifecycleProcessor.incremental=true
「インクリメンタルアノテーション処理が要求されたが、次のプロセッサがインクリメンタルではないためサポートが無効になっている」という苦情がある場合は、gradle.propertiesで「kapt.incremental.apt」を「true」に設定します(別の回答で言及)直感的。 「false」に設定する必要があります。それは私のためにそれをしました。
Kotlin 1.3.31以降を使用Kotlin 1.3.30リリース
Android kotlin project gradle.properties file
# 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
本当にすべきなのは、build.gradle
モジュールアプリのbuildConfig
タグに次のコード行を実装することです。
javaCompileOptions {
annotationProcessorOptions {
arguments = [
"room.schemaLocation" : "$projectDir/schemas".toString(),
"room.incremental" : "true",
"room.expandProjection": "true"]
}
}
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
を代わりに実装させます。
このメソッドへの変更は、 here に示されているbuild.gradle
依存関係でも推奨されます。
これは、システム言語が英語以外の言語である場合、databinding側の "İ"などの文字の問題によっても発生する可能性があります。このような場合、英語のコンピューターシステム言語を使用して問題を解決します。