在日常的Android开发过程,我们不可避免地会在项目中引入一些第三方库,以引入Butterknife为例:
dependencies {
implementation 'com.jakewharton:butterknife:9.0.0-rc1'
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
}
之前在使用时我只是把上边的代码从文档里复制粘贴到build.gradle文件里,但是对于annotationProcessor 和implementation具体有什么区别并不了解
1.什么是annotationProcessor
annotationProcessor是APT(Annotation Processing Tool)工具中的一种,随着Android Gradle 插件 2.2 版本的发布,Android Gradle 插件提供了名为 annotationProcessor 的功能来完全代替 android-apt,不需要引入,可以直接在build.gradle文件中使用。
2.工作内容
annotationProcessor顾名思义是注解处理器的意思。它对源代码文件进行检测找出其中的Annotation,根据注解自动生成代码。 Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件,之后将编译生成的源文件和原来的源文件一起生成class文件
3.使用影响
annotationProcessor生成额外文件的规则是在依赖库里定义的,只在编译的时候执行,但是库最终不打包到apk中,所以使用Butterknife这类编译注解框架并不会增加apk的大小
4.kapt
Butterknife的文档里还有这么一句话:
If you are using Kotlin, replace annotationProcessor with kapt.
理解annotationProcessor的原理之后很容易就能猜到kapt也是APT工具的一种,使用 Kotlin 开发 Android 应用时,要在预编译阶段处理注解必须使用kotlin-kapt
而不能使用annotationProcessor,kotlin-kapt不是Android Gradle 内置插件需要额外引入
apply plugin: 'kotlin-kapt'
......
kapt "com.android.databinding:compiler:$android_plugin_version"
特别注意将 annotaionProcessor换成kapt时如果之前编译过,必须要先执行clean project再编译,才能让注解被正常处理!
5.总结运用
了解了annotationProcessor和kapt后在去看一些第三方库时,从库的引用方式就可以简单地看出它有没有使用编译期注解的技术了,比如:
compile 'com.alibaba:arouter-api:?'
annotationProcessor 'com.alibaba:arouter-compiler:?'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
从上边就可以看出Arouter使用了编译注解而retrofit并没有使用编译注解