關(guān)于KAPT(kotlin annotation processor tool)的一些坑

最近打算使用Annotation Processor(注解處理器) + Gradle plugin來(lái)實(shí)現(xiàn)Android項(xiàng)目的路由框架,恰巧現(xiàn)在負(fù)責(zé)的Android項(xiàng)目都是使用kotlin作為開(kāi)發(fā)語(yǔ)言,而且在官網(wǎng)看到kotlin有支持Annotation Processor的插件(http://kotlinlang.org/docs/reference/kapt.html),干脆就它了,結(jié)果擼代碼過(guò)程個(gè)中滋味真的是跟吃了shi一樣難受(這方面的資料國(guó)內(nèi)實(shí)在是少),下面就記錄下遇到的一些坑:

使用kapt后,Auto-Service沒(méi)有在resources下生成注冊(cè)注解處理器的文件

我們?cè)诙x自己的Processor后需要對(duì)這些注解處理器進(jìn)行注冊(cè),否則javac壓根不知道你有哪些注解處理器需要運(yùn)行,一般來(lái)說(shuō)我們可以手動(dòng)創(chuàng)建一個(gè)特殊的文件 javax.annotation.processing.ProcessorMETA-INF/services目錄下面,文件內(nèi)容每一行就是一個(gè)處理器,如:

org.example.SampleProcessor
org.example.Sample2Processor

但是這樣的工作每次要我們手動(dòng)完成是挺蛋疼的,所以Google爸爸提供了一個(gè)褲子來(lái)為我們自動(dòng)生成這些信息,就是com.google.auto.service:auto-service:1.0-rc4這個(gè)庫(kù)(其實(shí)里面也就是定義了一個(gè)Annotation Processor來(lái)幫助我們生成這個(gè)文件),但是我用了這個(gè)庫(kù)后發(fā)現(xiàn)運(yùn)行項(xiàng)目后我的Processor死活運(yùn)行不起來(lái),于是我墻內(nèi)外翻了個(gè)遍,找到篇有點(diǎn)關(guān)系的文章https://proandroiddev.com/hello-world-of-annotation-processing-in-kotlin-3ec0290c1fdd,重點(diǎn)是這句At the time of this article, 1.0-rc3 did not work, so I had to step back to 1.0-rc2.提到1.0-rc3無(wú)效(雖然我用的是rc4),但是我按照作者說(shuō)的將版本改回1.0-rc2后依然無(wú)效。無(wú)奈只能自己手動(dòng)添加這個(gè)文件了

在Android Studio3.0.1下使用kapt,出現(xiàn)各種莫名其妙的編譯錯(cuò)誤

首先,使用kapt后要調(diào)試Annotation Processor就已經(jīng)夠坑了(參考該文章https://medium.com/@daptronic/annotation-processing-with-kapt-and-gradle-237793f2be57),然而更坑的是同一個(gè)項(xiàng)目在我編譯完一次后,Rebuild項(xiàng)目出現(xiàn)各種奇葩問(wèn)題,比如運(yùn)行的是我上一次修改的代碼,中間我嘗試把其中一個(gè)Processor刪了,然后注冊(cè)文件里面也把該P(yáng)rocessor給刪掉,結(jié)果運(yùn)行一直報(bào)錯(cuò):無(wú)法找到這個(gè)我已經(jīng)刪掉的Processor,同樣是墻內(nèi)外翻了個(gè)遍也沒(méi)找到原因。但是我發(fā)現(xiàn)每次我關(guān)掉AS后再打開(kāi),該問(wèn)題就不出現(xiàn)了,所以懷疑是跟編譯的Daemon進(jìn)程有關(guān),果斷執(zhí)行gradle --stop再rebuild項(xiàng)目,一切正常?。?!原本我以為是我自己的一些配置導(dǎo)致的(用的是Mac機(jī)器),于是回到家我用Windows電腦再次寫(xiě)了一個(gè)demo,直接無(wú)法rebuild了。。。。。(報(bào)的錯(cuò)誤是無(wú)法刪除generate目錄下的文件,明顯就是有進(jìn)程占用了這個(gè)文件),解決方法同上,一個(gè)字:真TM坑

巨坑,使用kapt后,Processor中打印的warning級(jí)別以下的日志不會(huì)在控制臺(tái)中輸出

這個(gè)問(wèn)題實(shí)在是讓我比吃了shi更加難受,一開(kāi)始以為是默認(rèn)配置的問(wèn)題,于是查找官方文檔,在gradle.properties文件添加了kapt.verbose=true,滿(mǎn)心歡喜的rebuild項(xiàng)目,結(jié)果問(wèn)題依舊,Google了半天也沒(méi)找到相關(guān)問(wèn)題,Stack Overflow上提問(wèn)也石沉大海,最后直接去擼了下源碼沒(méi)發(fā)現(xiàn)問(wèn)題在哪(實(shí)在是沒(méi)時(shí)間擼了,有興趣的可以到https://github.com/JetBrains/kotlin/tree/master/plugins,https://github.com/JetBrains/kotlin/tree/master/libraries/tools這兩個(gè)路徑下應(yīng)該有你想要的,也可以靈活使用github搜索功能搜“kapt3”等關(guān)鍵詞),因?yàn)槲仪袚Q成AS自帶的AnnotationProcessor運(yùn)行項(xiàng)目是可以正常打印NOTE類(lèi)型的log的,所以肯定是kapt封裝的使用做了什么奇怪的動(dòng)作
在kotlin:1.2.20版本中該問(wèn)題已解決 https://youtrack.jetbrains.com/issue/KT-19203

事隔幾天才記錄下來(lái),目前想到的就這幾個(gè),想起來(lái)再加吧。。繼續(xù)造輪子去。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來(lái) What:A...
    zlcook閱讀 29,730評(píng)論 15 116
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 前面寫(xiě)了Android 開(kāi)發(fā):由模塊化到組件化(一),很多小伙伴來(lái)問(wèn)怎么沒(méi)有Demo啊?之所以沒(méi)有立刻放demo的...
    涅槃1992閱讀 8,219評(píng)論 4 37
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評(píng)論 6 342
  • 當(dāng)沒(méi)有選擇的時(shí)候,卻在苦苦追尋;而當(dāng)有選擇的時(shí)候,卻又產(chǎn)生了煩惱。 我不知道,是自己太瞻前顧后,還是本身不...
    語(yǔ)鳳閱讀 206評(píng)論 0 0

友情鏈接更多精彩內(nèi)容