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

时间:2019-06-20 18:16:25

标签: android gradle kotlin kapt

我一直在Gradle中安装依赖项,但我不明白为什么有时需要对生命周期和会议室数据库之类的库使用kapt来使用@Something批注。但是在Retrofit2和Gson等某些库中,我不需要使用kapt,而可以使用诸如@SerializedName之类的注释?

2 个答案:

答案 0 :(得分:1)

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

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


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

如果您使用annotationProcessor,则您的依赖项将打包在您的应用程序中,但将在编译应用程序时使用。

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

这样想:

  

如果您要坐火车,并且需要打印火车票,则不想随身携带打印机。打印机完成票证的打印后,您需要拿票并上火车。打印机已经完成了工作。您可以离开它。

如果用@AnAnnotation标记一些代码,则只希望处理该注释的库完成其工作并消失。因此,依赖项的特殊类型-annotationProcessor

现在介绍kapt。这很简单。如果要在具有Kotlin代码的项目中使用注释处理器,只需使用kapt而不是annotationProcessor。在Kotlin支持下,将其视为annotationProcessor


某些库使用@Annotations的方式有所不同。它们不会导致在编译时生成任何代码,但是会在运行时使用批注。

这些是通常的基于反射的库,可以在运行时中“浏览”代码。就像Retrofit在执行您的应用时浏览interface

这就是为什么您通常在应用程序中包括一个带有@Annotations的库,并且这些批注打包在apk中用于运行时操作的原因。


总结:

annotationProcessorkapt关键字可帮助您指定在项目中如何使用依赖项。

如果您想引入一个使用批注并生成一些代码的库,请使用kapt不要用已经完成其工作并且将不再使用的代码来“夸大”您的apk。

答案 1 :(得分:0)

通常,库通过以下两种方式之一与注释交互:

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

要回答您的问题,没有通用的方法来知道依赖注释的库是否带有注释处理器。您应该检查特定库的文档并按照安装说明进行操作。