Bagaimana cara menghilangkan pemrosesan anotasi tambahan yang diminta peringatan?

150

Saya baru saja mulai menggunakan pengembangan android dan mencoba menggunakan perpustakaan Room. Sejak kemarin saya menghadapi pesan peringatan ini

w: [kapt] Diproses pemrosesan anotasi tambahan, tetapi dukungan dinonaktifkan karena prosesor berikut ini tidak inkremental: androidx.lifecycle.LifecycleProcessor (NON_INCREMENTAL), androidx.room.RoomProcessor (NON_INCREMENTAL).

Saya telah mencoba untuk meneliti dan memperbaiki tetapi tidak dapat menghindari kesalahan ini di sini adalah file grale.build saya. tolong sarankan / saran apa yang saya lakukan salah.

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
sumber
mengapa Proses anotasi Anda dikomentari? Apakah Anda mencoba untuk menghilangkan komentar pada mereka dan kemudian membangun proyek? (untuk kamar dan siklus hidupnya)
Ferhat Ergün
1
coba tambahkan android.enableSeparateAnnotationProcessing = true di gradle.properities Anda reddit.com/r/androiddev/comments/ai92pt/… ditemukan pada ini, mungkin terkait dengan masalah Anda
Ferhat Ergün
7
Anda dapat menurunkan versi kotlin-gradle-plugin di file build.gradle proyek Anda ke versi 1.3.41 untuk saat ini. Saya pikir ini adalah bug yang terkait dengan kapt. Info lebih lanjut: youtrack.jetbrains.com/issue/KT-33515
Necrontyr
4
Anda juga dapat membuat file properti gradle.prop di libs / <nama modul Anda> dengan kapt.incremental.apt=falseseperti yang dijelaskan dalam masalah sebagai solusi. Ini berhasil untuk saya.
Necrontyr
2
@Necrontyr, saran Anda benar-benar berhasil. Terima kasih banyak
Shax

Jawaban:

80

Ada bug dalam versi kotlin-gradle-plugin 1.3.50 seperti yang disebutkan @Necrontyr. Turunkan saja kotlin_version di build.gradle (Project) menjadi 1.3.41.

Mücahid Kambur
sumber
71
Bug yang disebutkan oleh @Necrontyr tidak terkait dengan peringatan. Peringatan sebenarnya dimaksudkan dan turun ke 1.3.41 hanya menyembunyikan peringatan tetapi masalahnya tetap sama, jika tidak lebih buruk. Orang mungkin berpikir bahwa karena mereka mengaktifkan pemrosesan anotasi tambahan, itu akan membuat segalanya lebih cepat. Tetapi kebenarannya adalah bahwa jika ada salah satu dari prosesor anotasi yang tidak inkremental maka tidak satupun dari mereka akan diproses secara bertahap. Ini adalah pengingat ramah yang akan menunjukkan perpustakaan apa penyebabnya.
Antimonit
15
Menggunakan versi perpustakaan yang sudah ketinggalan zaman bukanlah solusi.
Andrew Koster
5
Apakah ini masih terjadi dengan Kotlin 1.3.70?
IgorGanapolsky
2
Saya menggunakan Kotlin 1.3.72 dan masih menghadapi masalah ini?
Anbuselvan Rocky
4
Saya juga menghadapi masalah ini 1.3.72 ada solusi kawan?
hiashutoshsingh
174

Cukup tambahkan baris ini untuk Anda gradle.properties:

kapt.incremental.apt=true
Ali Ahmed
sumber
11
Ini adalah pilihan yang lebih baik daripada jawaban yang diterima. Bagi mereka yang perlu memahami dan masuk ke perincian lebih lanjut, lihat tautan ini: medium.com/avast-engineering/…
Abhimanyu
4
gagal untuk saya juga.
steven smith
adakah yang menjadi alasan mengapa hal ini terjadi di sini?
Omer
Saya baru-baru ini mengaktifkan pengikatan data ke proyek android (kotlin) saya dan mulai mendapatkan peringatan ini. Menambahkan properti seperti yang disebutkan di atas berhasil untuk saya. Juga menggunakan versi terbaru dari segalanya, misalnya semua dependensi, kompiler, alat bangun, SDK, dll.
Gail
4
Melakukan ini saja, tidak berhasil untuk saya. Saya juga harus mengedit file build.gradle saya seperti yang dijelaskan dalam dokumentasi untuk perpustakaan Room .
Nelson Ferragut
121

Masalah sebenarnya adalah bahwa pemrosesan inkremental membuat segalanya lebih cepat, tetapi jika salah satu prosesor anotasi adalah non-inkremental, tidak satupun dari mereka yang benar-benar akan diproses dengan cara itu.

Apa tujuan dari pemrosesan bertahap?

Dari versi 1.3.30+ , pemrosesan tambahan memungkinkan modul untuk tidak sepenuhnya diproses lagi setiap kali terjadi perubahan, memberikan proses pembuatan kinerja yang lebih baik:

Area fokus utama untuk rilis ini adalah seputar Kotlin / Asli, kinerja KAPT, serta peningkatan untuk IntelliJ IDEA.

Dari dokumentasi Kotlin :

Prosesor anotasi (lihat JSR 269) didukung di Kotlin dengan plugin kompiler kapt. Singkatnya, Anda dapat menggunakan perpustakaan seperti Belati atau Binding Data dalam proyek Kotlin Anda.

Bagaimana cara memperbaiki Pemrosesan Tambahan Ruang?

Dan prosesor anotasi penambahan ruang dinonaktifkan secara default. Ini adalah masalah yang diketahui dan dijelaskan di sini . Mereka bermaksud memperbaikinya pada versi 2.2.0. Anda bisa menunggu pembaruan atau mengaktifkannya untuk menghilangkan peringatan dengan mengatur:

dalam file gradle.properties :

kapt.incremental.apt=true

(langkah opsional)

untuk memungkinkan penyatuan data menjadi inkremental:

android.databinding.incremental=true

untuk membangun lebih cepat:

kapt.use.worker.api=true

jika hanya beberapa perubahan yang dibuat, waktu pembuatan sangat berkurang:

kapt.include.compile.classpath=false

(kembali ke topik)

di build.gradle proyek Anda , tambahkan dependensi yang diperlukan (Groovy):

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

dan

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

Versi DSL Kotlin:

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

dan

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

Edit:

9 Oktober 2019

androidx.room:room-*:.2.0 dirilis .

Grador Incremental Annotation Processor: Room sekarang merupakan prosesor anotasi isolasi Gradle dan peningkatan dapat diaktifkan melalui ruang opsi prosesor. Incremental.

Dimas Mendes
sumber
8
Yang ini harus diterima sebagai kapt.incremental.apt = true adalah sesuatu yang akan hilang ketika menyertakan Kamar dalam proyek Anda. Yang itu bahkan tidak disebutkan dalam dokumen Android untuk Kamar
sela
1
Jawaban ini membantu saya ketika saya menggunakan androidx.lifecycle:lifecycle-extensionsdalam versi 2.1.0 dan setelah beralih ke 2.2.0-beta01 peringatan hilang!
simne7
2
@ simne7 lihat edit saya pada akhirnya. versi 2.2.0 dirilis =) Anda dapat memutakhirkannya untuk mengakses fitur pemrosesan tambahan dan meningkatkan versi Anda.
Dimas Mendes
Akan memungkinkan android.buildcache=true membuatnya lebih cepat?
IgorGanapolsky
1
@IgorGanapolsky menurut Situs Web Pengembang Google, Projects using Android plugin 2.3.0 and higher enable the build cache by default (unless you explicitly disable the build cache) ,. Jadi tidak masuk akal untuk mengaktifkannya karena diaktifkan secara default.
Dimas Mendes
37

Dari dokumentasi Kamar :

"Kamar memiliki opsi prosesor anotasi berikut ... room.incremental: Mengaktifkan prosesor anotasi kenaikan bertahap Gradle."

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

Pastikan untuk memperbarui versi kamar ke 2.2.x atau lebih tinggi.

Alberto Gaona
sumber
3
Jawab orang yang tepat, jika Anda ingin terus memproses tambahan. Anda mungkin tidak perlu schemaLocation atau memperluas argumen Proyeksi yang ditetapkan di atas. cukup ruang tambahan.
bajicdusko
1
Menurut developer.android.com/jetpack/androidx/releases/room , masih ada versi 2.2.0-rc01.
CoolMind
Perbarui versi kamar ke 2.2.0 ini bekerja untuk saya
DivideBy0
25

Berikut adalah daftar hal-hal yang dapat Anda lakukan untuk memperbaikinya dan secara signifikan mengurangi waktu pembuatan saat Anda menggunakannya.

Dalam build.gradlefile (modul) Anda:

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

Dalam gradle.propertiesfile Anda :

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

Aktifkan permintaan pemrosesan anotasi Kapt Incremental

Gunakan Kotlin 1.3.31 atau yang lebih baru Kotlin 1.3.30 dirilis

Dalam file proyek gradle.properties proyek android Anda

# 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
sumber
Bagaimana dengan android.lifecycleProcessor.incremental=true?
IgorGanapolsky
10

Banyak jawaban lain di sini menutupi kesalahan atau menonaktifkan pemrosesan bertahap alih-alih membuatnya berfungsi seperti yang Anda inginkan.

Anda dapat mengaktifkan pemrosesan tambahan untuk pustaka spesifik Anda di gradle.propertiesfile. Cukup tambahkan pengaturan ini, atau yang mana saja yang cocok dengan perpustakaan yang melempar kesalahan:

android.databinding.incremental=true
android.lifecycleProcessor.incremental=true
Jacques
sumber
2
Saya tidak begitu yakin tentang android.lifecycleProcessor.incremental=true, sepertinya tidak didokumentasikan di mana saja
Daniel Wilson
Saya juga tidak yakin, tetapi saya mencobanya pada firasat dan kompiler berhenti memberi tahu saya bahwa perpustakaan siklus hidupProcessor tidak memiliki pemrosesan tambahan yang diaktifkan.
Jacques.S
5

Jika mengeluh bahwa "pemrosesan anotasi tambahan diminta, tetapi dukungan dinonaktifkan karena prosesor berikut ini tidak bertahap", kemudian menetapkan "kapt.incremental.apt" menjadi "true" (disebutkan dalam jawaban yang berbeda) di gradle.properties bersifat kontra- intuitif. Anda perlu mengaturnya ke "false". Itu berhasil untuk saya.

DC Christopher
sumber
1
Ini benar-benar berhasil. Setel ke orang SALAH! terima kasih
Sakiboy
Dan apa yang akan terjadi? Apakah akan mengkompilasi lebih cepat atau hanya menyembunyikan peringatan?
CoolMind
@CoolMind Anda akan menonaktifkan pemrosesan anotasi tambahan, sesuatu yang bagaimanapun tidak akan terjadi jika salah satu dari dependensi Anda tidak mendukungnya. Jadi, peringatan itu hilang dan tidak ada perubahan dalam proses pembangunan dari sebelumnya.
DC Christopher
2
Pengaturan yang mengejutkan kapt.incremental.apt=falsemembantu saya, saya tidak lagi mendapatkan kesalahan
Rakhi Dhavale
2
Anda tidak memiliki kesalahan lagi tetapi sekarang Anda tidak memiliki pemrosesan tambahan :)
JustAnotherCoder
2

Saya menggunakan AndroidX , tapi itu kira sama untuk android.arch.lifecycle. Bagi saya itu hanya membantu mengganti ini:

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

... dengan ini:

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

Jadi jika Anda menggunakannya android.arch.lifecyclemungkin memiliki efek yang sama menggantikan ini:

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

... dengan ini:

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

Ketahuilah bahwa ini hanya berfungsi jika Anda menggunakan Java 8 dan Anda juga harus menghapus OnLifecycleEventanotasi untuk LifecycleObserverkelas dan membiarkan pengamat tersebut menerapkanDefaultLifecycleObserver .

Mengubah metode ini juga disarankan dalam keadaan build.gradledarurat yang ditunjukkan di sini .

Anigif
sumber
Mengapa kamu disingkirkan kapt?
IgorGanapolsky
@IgorGanapolsky Itulah yang disarankan oleh AndroidX Lifecycle jika Anda menggunakan Java 8. Lihat lebih lanjut di sini: developer.android.com/jetpack/androidx/releases/…
Anigif
kaptsangat penting untuk Kotlin
IgorGanapolsky
1
Hanya jika lib membutuhkannya. Menurut halaman ini, anotasi akan dihentikan ketika Java 8 mendapatkan lebih banyak mainstream di Android, jadi mereka merekomendasikan common-java8jika memungkinkan: developer.android.com/reference/androidx/lifecycle/Lifecycle/Lifecycle
Anigif
Menarik. Mereka tidak menyebutkan kaptsecara khusus ...
IgorGanapolsky
2

Yang harus Anda lakukan adalah menerapkan baris kode ini di buildConfigtag Anda di build.gradleaplikasi modul Anda:

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

Jawaban atas dapat berguna, tapi apa yang membantu saya adalah mengurangi kotlin_versiondalam build.gradle(Project)untuk1.3.41 dan membangun proyek. Ini akan memungkinkan Anda untuk melihat apakah ada masalah dengan model entitas Anda.

Milik saya, saya lupa membubuhi keterangan @PrimaryKey. Anda mungkin sesuatu yang berbeda. Kotlin 1.3.41memungkinkan untuk melihat masalah-masalah itu. Perbaiki masalah tersebut dan kembalikan kotlin_versionke masalah sebelumnya.

Sourav Roy
sumber
-1

Ini juga dapat disebabkan oleh masalah karakter seperti " İ " di sisi penyatuan data ketika bahasa sistem adalah bahasa non-Inggris. Dalam kasus seperti itu, menggunakan bahasa sistem komputer dalam bahasa Inggris akan menyelesaikan masalah.

Hasan Kucuk
sumber