最近打算使用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.Processor到META-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ù)造輪子去。。