วิธีการกำจัดการประมวลผลคำอธิบายประกอบที่เพิ่มขึ้นได้รับการร้องขอคำเตือน?


150

ฉันเพิ่งเริ่มต้นใช้การพัฒนาแอนดรอยด์และพยายามใช้ห้องสมุดห้อง ตั้งแต่เมื่อวานฉันกำลังเผชิญกับข้อความเตือนนี้

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

เหตุใดคำอธิบายประกอบตัวประมวลผลของคุณแสดงความคิดเห็น คุณพยายามที่จะคอมเม้นท์พวกเขาแล้วสร้างโครงการหรือไม่? (สำหรับทั้งห้องและวงจรชีวิต)
Ferhat Ergün

1
พยายามที่จะเพิ่ม android.enableSeparateAnnotationProcessing = จริงใน gradle.properities ของคุณreddit.com/r/androiddev/comments/ai92pt/พบกับเรื่องนี้มันอาจเกี่ยวข้องกับปัญหาของคุณ
Ferhat Ergün

7
คุณสามารถดาวน์เกรด kotlin-gradle-plugin ในไฟล์ build.gradle โครงการเป็นเวอร์ชัน 1.3.41 ในขณะนี้ ฉันคิดว่ามันเป็นข้อผิดพลาดที่เกี่ยวข้องกับ kapt ข้อมูลเพิ่มเติม: youtrack.jetbrains.com/issue/KT-33515
Necrontyr

5
คุณยังสามารถสร้างไฟล์ gradle.properties ใน libs / <ชื่อโมดูลของคุณ> ด้วยkapt.incremental.apt=falseเช่นกันตามที่อธิบายไว้ในปัญหาเป็นวิธีแก้ปัญหา มันใช้งานได้สำหรับฉัน
Necrontyr

2
@Necrontyr ข้อเสนอแนะของคุณได้ผลจริงๆ ขอบคุณมาก
Shax

คำตอบ:


80

มีข้อบกพร่องในรุ่น kotlin-gradle-plugin 1.3.50 ตามที่ @Necrontyr พูดถึง เพียงปรับลดรุ่น kotlin_version ใน build.gradle (โครงการ) เป็น 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 คุณสมบัติ:

kapt.incremental.apt=true

11
นี่คือตัวเลือกที่ดีกว่าที่คำตอบที่ยอมรับ สำหรับผู้ที่ต้องการทำความเข้าใจและรับรายละเอียดเพิ่มเติมให้อ้างอิงลิงค์นี้: Medium.com/avast-engineering/ …
Abhimanyu

4
faild สำหรับฉันด้วย
steven smith

มีใครที่เป็นสาเหตุว่าทำไมมันเกิดขึ้นที่นี่?
Omer

ฉันเพิ่งเปิดใช้งานข้อมูลที่เชื่อมโยงกับโครงการ android (kotlin) ของฉันและเริ่มได้รับคำเตือนนี้ การเพิ่มคุณสมบัติตามที่ระบุข้างต้นได้ผลสำหรับฉัน นอกจากนี้ยังใช้รุ่นล่าสุดของทุกอย่างเช่นการอ้างอิงทุกคอมไพเลอร์, เครื่องมือสร้าง SDKs ฯลฯ
เกล

4
การทำเช่นนี้ไม่ได้ผลสำหรับฉัน ฉันได้ไปยังแก้ไขไฟล์ build.gradle ของฉันที่อธิบายไว้ในเอกสารสำหรับห้องสมุดห้อง
Nelson Ferragut

121

ปัญหาที่แท้จริงคือการประมวลผลแบบเพิ่มหน่วยทำให้สิ่งต่าง ๆ เร็วขึ้น แต่ถ้าตัวประมวลผลคำอธิบายประกอบใดไม่เพิ่มขึ้นจะไม่มีการประมวลผลคำอธิบายประกอบจริง ๆ

วัตถุประสงค์ของการประมวลผลแบบเพิ่มคืออะไร

จากเวอร์ชัน1.3.30+การประมวลผลแบบเพิ่มหน่วยอนุญาตให้ไม่ประมวลผลทั้งหมดอีกครั้งทุกครั้งที่มีการเปลี่ยนแปลงทำให้กระบวนการสร้างมีประสิทธิภาพที่ดีขึ้น:

ประเด็นหลักของการมุ่งเน้นสำหรับรุ่นนี้คือประสิทธิภาพของ Kotlin / Native, KAPT รวมถึงการปรับปรุง IntelliJ IDEA

จากเอกสาร Kotlin :

โปรเซสเซอร์หมายเหตุประกอบ (ดู JSR 269) ได้รับการสนับสนุนใน Kotlin ด้วยปลั๊กอินคอมไพเลอร์ kapt สรุปคุณสามารถใช้ไลบรารีเช่น Dagger หรือ Data Binding ในโครงการ Kotlin ของคุณ

จะแก้ไขการเพิ่มห้องพักได้อย่างไร?

และตัวประมวลผลคำอธิบายประกอบแบบเพิ่มห้องจะถูกปิดใช้งานตามค่าเริ่มต้น นี่เป็นปัญหาที่เป็นที่รู้จักและก็อธิบายไว้ที่นี่ พวกเขาตั้งใจจะซ่อมในเวอร์ชั่น 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")
            }
        }
    } 
}

แก้ไข:

9 ตุลาคม 2019

androidx.room:room-*:2.2.0 เปิดตัวแล้ว

ตัวประมวลผลคำอธิบายประกอบแบบค่อยเป็นค่อยไป Gradle: ห้องพักเป็นโปรเซสเซอร์แบบแยกคำอธิบายประกอบแบบแยกส่วนของ Gradle และสามารถเปิดใช้งานความสามารถในการเพิ่มได้ผ่านทางตัวเลือกโปรเซสเซอร์ room.incremental


8
สิ่งนี้ควรได้รับการยอมรับว่าเป็น kapt.incremental.apt = true คือสิ่งที่จะหายไปเมื่อรวม Room ในโครงการของคุณ อันนั้นไม่ได้กล่าวถึงในเอกสาร Android สำหรับห้องพัก
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 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

จากเอกสารห้องพัก :

"ห้องมีตัวเลือกคำอธิบายประกอบโปรเซสเซอร์ต่อไปนี้ ...

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

อย่าลืมอัปเดตเวอร์ชันห้องเป็น 2.2.x หรือสูงกว่า


3
แก้ไขคำตอบของคนถ้าคุณต้องการที่จะประมวลผลที่เพิ่มขึ้น คุณอาจไม่ต้องการ schemaLocation หรือ expandProject arguments ตั้งไว้ด้านบน ห้องพักที่เพียงพอ
bajicdusko

1
ตามที่developer.android.com/jetpack/androidx/releases/roomยังคงมีเวอร์ชัน 2.2.0-rc01
CoolMind

1
มันออกตอนนี้ -> developer.android.com/jetpack/androidx/releases/…
jesses.co.tt

อัปเดตเวอร์ชันห้องเป็น 2.2.0 ซึ่งใช้งานได้สำหรับฉัน
DivideBy0

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 ไม่ได้เปิดใช้งานการประมวลผลที่เพิ่มขึ้น
Jacques.S

5

ถ้ามันบ่นว่า "การประมวลผลคำอธิบายประกอบที่เพิ่มขึ้นร้องขอ แต่การสนับสนุนถูกปิดใช้งานเพราะโปรเซสเซอร์ต่อไปนี้ไม่ได้เพิ่ม" จากนั้นตั้งค่า "kapt.incremental.apt" เป็น "จริง" (กล่าวถึงในคำตอบที่แตกต่างกัน) ใน gradle.properties ที่ใช้งานง่าย คุณต้องตั้งค่าเป็น "false" นั่นทำเพื่อฉัน


1
มันใช้งานได้จริง กำหนดให้เป็นคน FALSE! ขอบคุณ
Sakiboy

แล้วจะเกิดอะไรขึ้น มันจะคอมไพล์ได้เร็วขึ้นหรือซ่อนคำเตือน?
CoolMind

@CoolMind คุณจะปิดใช้งานการประมวลผลคำอธิบายประกอบแบบเพิ่มสิ่งที่จะไม่เกิดขึ้นหากการอ้างอิงใด ๆ ของคุณไม่สนับสนุน ดังนั้นคำเตือนจะหายไปและไม่มีการเปลี่ยนแปลงในกระบวนการสร้างจากก่อนหน้านี้
DC Christopher

2
การตั้งค่าที่น่าแปลกใจkapt.incremental.apt=falseช่วยฉันฉันไม่ได้รับข้อผิดพลาด
Rakhi Dhavale

2
คุณไม่มีข้อผิดพลาด แต่ตอนนี้คุณไม่มีการประมวลผลเพิ่มเติม :)
JustAnotherCoder

2

ฉันใช้AndroidXandroid.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.gradledepencies แสดงที่นี่


ทำไมคุณถึงกำจัดkapt?
IgorGanapolsky

@IgorGanapolsky นั่นคือสิ่งที่แนะนำโดย AndroidX Lifecycle หากคุณใช้ 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

สิ่งที่คุณควรทำคือการนำโค้ดเหล่านี้มาใช้ในbuildConfigแท็กของคุณในbuild.gradleแอพโมดูลของคุณ:

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

0

คำตอบดังกล่าวข้างต้นจะมีประโยชน์ แต่สิ่งที่ช่วยให้ฉันจะลดkotlin_versionในbuild.gradle(Project)การ1.3.41และการสร้างโครงการ สิ่งนี้จะช่วยให้คุณดูว่ามีปัญหากับรุ่นเอนทิตี้ของคุณหรือไม่

@PrimaryKeyเหมืองแร่เป็นฉันลืมใส่คำอธิบายประกอบ คุณอาจจะแตกต่าง Kotlin 1.3.41อนุญาตให้เห็นปัญหาเหล่านั้น แก้ไขปัญหาเหล่านั้นและเปลี่ยนกลับkotlin_versionไปเป็นรายการก่อนหน้า


-1

สิ่งนี้อาจเกิดจากปัญหาของอักขระเช่น " İ " ที่ด้านข้อมูลdatabindingเมื่อภาษาของระบบเป็นภาษาที่ไม่ใช่ภาษาอังกฤษ ในกรณีเช่นนี้การใช้ภาษาของระบบคอมพิวเตอร์เป็นภาษาอังกฤษจะช่วยแก้ปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.