我一直在使用Gradle安装依赖,但是有些库比如Lifecycle和Room Database,需要使用kapt才能使用@Something
注释。但是像Retrofit2和Gson这样的库,我不需要使用kapt,我可以使用@SerializedName
这样的注释吗?
注解(例如@Something
)基本上是代码的标签。您标记代码的某个部分,以便一些其他代码可以找到这些标记。
这"其他代码"通常是注解处理器。它查找注解并对使用这些注解标记的代码执行某些操作。例如,它可以生成新的代码(如Dagger、Butterknife等)。
根据您在项目中引入依赖项的方式(取决于您使用的关键字-implementation
、api
、compileOnly
、runtimeOnly
、annotationProcessor
、kapt
等),依赖项将被项目以不同的方式使用。
如果您使用annotationProcessor
,则您的依赖项不会打包在应用程序中,而是在编译应用程序时使用。
您不希望在应用程序中打包编译器(处理@AnAnnotation
的代码),因为它仅用于正确准备应用程序的代码(并且从未在运行时中使用)。
这样想:
如果你在一些代码上打上如果您要乘火车,并需要打印火车票,您不想在火车上携带打印机。打印机完成后,您拿走车票并上火车。打印机已经完成了它的工作。您可以离开它。
@AnAnnotation
的标记,那么你只是想让处理该注释的库完成它的工作并消失。因此有了特殊类型的依赖-annotationProcessor
。kapt
,这很简单。如果您想在带有Kotlin代码的项目中使用注释处理器,只需使用kapt
代替annotationProcessor
。把它看作支持Kotlin的annotationProcessor
即可。@Annotations
。 它们不会导致编译时生成任何代码,而是在运行时使用注释。interface
一样。@Annotations
的库,这些注释被打包在apk中进行运行时操作。annotationProcessor
和kapt
是为了帮助您指定依赖项在项目中的使用方式。如果您想引入一个使用注释并生成一些代码的库,使用kapt
,以避免将已经完成其工作且永远不会再使用的代码“膨胀”到apk中。通常,库与注解的交互方式有以下两种:
kapt
或 annotationProcessor
。例如:Retrofit 使用反射来访问注解,而且不包括注解处理器。butterknife-compiler
的独立模块,其中包含注解处理器。您应该将 butterknife-compiler
作为 kapt
或 annotationProcessor
依赖项使用,而不是使用 implementation
,api
或 compile
,因为您在运行时不需要注解处理器。回答您的问题,没有通用的方法可以知道依赖注解的库是否带有注解处理器。您应该查看特定库的文档,并遵循安装说明。