我一直在Gradle中安装依赖项,但我不明白为什么有时需要对生命周期和会议室数据库之类的库使用kapt来使用@Something
批注。但是在Retrofit2和Gson等某些库中,我不需要使用kapt,而可以使用诸如@SerializedName
之类的注释?
答案 0 :(得分:1)
注释(例如@Something
)基本上是代码标签。您标记了代码的一部分,以便某些其他代码可以找到这些标记。
此“ 其他代码”通常是注释处理器。它查找注释,并使用标记有这些注释的代码执行某些操作。例如。它可以生成新代码(例如Dagger,Butterknife等)。
取决于您在项目中引入依赖项的方式,(取决于您使用的keyword
-implementation
,api
,compileOnly
,runtimeOnly
, annotationProcessor
,kapt
等),项目将以不同的方式使用依赖项。
如果您使用annotationProcessor
,则您的依赖项将不打包在您的应用程序中,但将在编译应用程序时使用。
您不想将编译器(处理@AnAnnotation
的代码)打包到您的应用程序中,因为它只是用于正确准备应用程序的代码(并且从未在运行时中用于您的应用程序中) 。
这样想:
如果您要坐火车,并且需要打印火车票,则不想随身携带打印机。打印机完成票证的打印后,您需要拿票并上火车。打印机已经完成了工作。您可以离开它。
如果用@AnAnnotation
标记一些代码,则只希望处理该注释的库完成其工作并消失。因此,依赖项的特殊类型-annotationProcessor
。
现在介绍kapt
。这很简单。如果要在具有Kotlin代码的项目中使用注释处理器,只需使用kapt
而不是annotationProcessor
。在Kotlin支持下,将其视为annotationProcessor
。
某些库使用@Annotations
的方式有所不同。它们不会导致在编译时生成任何代码,但是会在运行时使用批注。
这些是通常的基于反射的库,可以在运行时中“浏览”代码。就像Retrofit在执行您的应用时浏览interface
。
这就是为什么您通常在应用程序中包括一个带有@Annotations
的库,并且这些批注打包在apk中用于运行时操作的原因。
总结:
annotationProcessor
和kapt
关键字可帮助您指定在项目中如何使用依赖项。
如果您想引入一个使用批注并生成一些代码的库,请使用kapt
不要用已经完成其工作并且将不再使用的代码来“夸大”您的apk。
答案 1 :(得分:0)
通常,库通过以下两种方式之一与注释交互:
kapt
或annotationProcessor
。示例:翻新,该翻新使用反射来访问注释,并且不包括注释处理器。butterknife-compiler
模块,其中包含注释处理器。您应该将butterknife-compiler
用作kapt
或annotationProcessor
依赖项,而不是implementation
,api
或compile
,因为您不需要运行时中的注释处理器。要回答您的问题,没有通用的方法来知道依赖注释的库是否带有注释处理器。您应该检查特定库的文档并按照安装说明进行操作。