最近打算使用Annotation Processor(注解处理器) + Gradle plugin来实现Android项目的路由框架,恰巧现在负责的Android项目都是使用kotlin作为开发语言,而且在官网看到kotlin有支持Annotation Processor的插件(http://kotlinlang.org/docs/reference/kapt.html),干脆就它了,结果撸代码过程个中滋味真的是跟吃了shi一样难受(这方面的资料国内实在是少),下面就记录下遇到的一些坑:
使用kapt后,Auto-Service没有在resources下生成注册注解处理器的文件
我们在定义自己的Processor后需要对这些注解处理器进行注册,否则javac压根不知道你有哪些注解处理器需要运行,一般来说我们可以手动创建一个特殊的文件 javax.annotation.processing.Processor
到META-INF/services
目录下面,文件内容每一行就是一个处理器,如:
org.example.SampleProcessor
org.example.Sample2Processor
但是这样的工作每次要我们手动完成是挺蛋疼的,所以Google爸爸提供了一个裤子来为我们自动生成这些信息,就是com.google.auto.service:auto-service:1.0-rc4
这个库(其实里面也就是定义了一个Annotation Processor来帮助我们生成这个文件),但是我用了这个库后发现运行项目后我的Processor死活运行不起来,于是我墙内外翻了个遍,找到篇有点关系的文章https://proandroiddev.com/hello-world-of-annotation-processing-in-kotlin-3ec0290c1fdd,重点是这句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无效(虽然我用的是rc4),但是我按照作者说的将版本改回1.0-rc2后依然无效。无奈只能自己手动添加这个文件了
在Android Studio3.0.1下使用kapt,出现各种莫名其妙的编译错误
首先,使用kapt后要调试Annotation Processor就已经够坑了(参考该文章https://medium.com/@daptronic/annotation-processing-with-kapt-and-gradle-237793f2be57),然而更坑的是同一个项目在我编译完一次后,Rebuild项目出现各种奇葩问题,比如运行的是我上一次修改的代码,中间我尝试把其中一个Processor删了,然后注册文件里面也把该Processor给删掉,结果运行一直报错:无法找到这个我已经删掉的Processor,同样是墙内外翻了个遍也没找到原因。但是我发现每次我关掉AS后再打开,该问题就不出现了,所以怀疑是跟编译的Daemon进程有关,果断执行gradle --stop
再rebuild项目,一切正常!!!原本我以为是我自己的一些配置导致的(用的是Mac机器),于是回到家我用Windows电脑再次写了一个demo,直接无法rebuild了。。。。。(报的错误是无法删除generate目录下的文件,明显就是有进程占用了这个文件),解决方法同上,一个字:真TM坑
巨坑,使用kapt后,Processor中打印的warning级别以下的日志不会在控制台中输出
这个问题实在是让我比吃了shi更加难受,一开始以为是默认配置的问题,于是查找官方文档,在gradle.properties
文件添加了kapt.verbose=true
,满心欢喜的rebuild项目,结果问题依旧,Google了半天也没找到相关问题,Stack Overflow上提问也石沉大海,最后直接去撸了下源码没发现问题在哪(实在是没时间撸了,有兴趣的可以到https://github.com/JetBrains/kotlin/tree/master/plugins,https://github.com/JetBrains/kotlin/tree/master/libraries/tools这两个路径下应该有你想要的,也可以灵活使用github搜索功能搜“kapt3”等关键词),因为我切换成AS自带的AnnotationProcessor运行项目是可以正常打印NOTE类型的log的,所以肯定是kapt封装的使用做了什么奇怪的动作
在kotlin:1.2.20版本中该问题已解决 https://youtrack.jetbrains.com/issue/KT-19203
事隔几天才记录下来,目前想到的就这几个,想起来再加吧。。继续造轮子去。。