何时需要在Gradle依赖中使用Kapt?

12

我一直在使用Gradle安装依赖,但是有些库比如Lifecycle和Room Database,需要使用kapt才能使用@Something注释。但是像Retrofit2和Gson这样的库,我不需要使用kapt,我可以使用@SerializedName这样的注释吗?

2个回答

25

注解(例如@Something)基本上是代码的标签。您标记代码的某个部分,以便一些其他代码可以找到这些标记。

这"其他代码"通常是注解处理器。它查找注解并对使用这些注解标记的代码执行某些操作。例如,它可以生成新的代码(如Dagger、Butterknife等)。


根据您在项目中引入依赖项的方式(取决于您使用的关键字-implementationapicompileOnlyruntimeOnlyannotationProcessorkapt等),依赖项将被项目以不同的方式使用。

如果您使用annotationProcessor,则您的依赖项不会打包在应用程序中,而是在编译应用程序时使用。

您不希望在应用程序中打包编译器(处理@AnAnnotation的代码),因为它仅用于正确准备应用程序的代码(并且从未在运行时中使用)。

这样想:

如果您要乘火车,并需要打印火车票,您不想在火车上携带打印机。打印机完成后,您拿走车票并上火车。打印机已经完成了它的工作。您可以离开它。

如果你在一些代码上打上@AnAnnotation的标记,那么你只是想让处理该注释的库完成它的工作并消失。因此有了特殊类型的依赖-annotationProcessor
关于kapt,这很简单。如果您想在带有Kotlin代码的项目中使用注释处理器,只需使用kapt代替annotationProcessor。把它看作支持Kotlin的annotationProcessor即可。
一些库以不同的方式使用@Annotations。 它们不会导致编译时生成任何代码,而是在运行时使用注释。
通常这些是基于反射的库,在运行时“查看”代码,就像Retrofit在执行应用程序时查看您的interface一样。
这就是为什么你要在应用程序中正常地包含带有@Annotations的库,这些注释被打包在apk中进行运行时操作。
总结一下:关键字annotationProcessorkapt是为了帮助您指定依赖项在项目中的使用方式。如果您想引入一个使用注释并生成一些代码的库,使用kapt,以避免将已经完成其工作且永远不会再使用的代码“膨胀”到apk中。

1
@WayFaiGodfreyCheng 如果这个答案对您有帮助,请随意接受它。 - Bartek Lipinski

3

通常,库与注解的交互方式有以下两种:

  • 使用反射。 库代码可以在运行时查询注解以执行某些逻辑。这些库通常会被打包为单个组件,并且不需要使用 kaptannotationProcessor。例如:Retrofit 使用反射来访问注解,而且不包括注解处理器。
  • 使用注解处理器。 注解处理器是编译器插件,可以在主编译步骤之前调用,可以访问注解及其周围的代码,并根据此输入执行任务。注解处理器通常以单独的组件形式提供,因为它们包含在运行时不需要的代码,因此不应将其打包到 APK 中。例如:Butterknife 在编译期间处理注解,并带有一个名为 butterknife-compiler 的独立模块,其中包含注解处理器。您应该将 butterknife-compiler 作为 kaptannotationProcessor 依赖项使用,而不是使用 implementationapicompile,因为您在运行时不需要注解处理器。

回答您的问题,没有通用的方法可以知道依赖注解的库是否带有注解处理器。您应该查看特定库的文档,并遵循安装说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接