我什么时候需要在 Gradle 依赖项中使用 Kapt?
When do I need to use Kapt in Gradle dependencies?
我一直在Gradle中安装依赖项,我不明白为什么有时我需要使用kapt来使用生命周期和房间数据库等库来使用@Something
注解。但是在一些像 Retrofit2 和 Gson 这样的库中,我不需要使用 kapt,我可以使用诸如 @SerializedName
?
这样的注解
注释(例如 @Something
)基本上是代码的标签。您标记代码的一部分,以便某些 其他代码 可以找到这些标记。
这个“其他代码”通常是一个注解处理器。它会查找注释并使用标有这些注释的代码执行某些操作。例如。它可以生成新代码(如 Dagger、Butterknife 等)。
取决于您在项目中引入依赖项的方式,(取决于您使用的 keyword
- implementation
、api
、compileOnly
、runtimeOnly
、annotationProcessor
、kapt
等),您的项目将以不同方式使用依赖项。
如果您使用 annotationProcessor
,您的依赖项将不会打包到您的应用程序中,但会在您的应用程序编译期间使用。
您不想在您的应用程序中打包编译器(处理 @AnAnnotation
的代码),因为它只是用于正确准备您的应用程序代码(并且从未在您的应用程序中使用过运行)。
这样想:
If you're going on a train and you need to print a train ticket, you don't want to carry a printer with you on the train. After the printer is done printing the ticket, you take the ticket and go on the train. Printer has done its job already. You can leave it.
如果您使用 @AnAnnotation
标记某些代码,您只希望处理该注释的库完成其工作并消失。因此,特殊类型的依赖项 - annotationProcessor
.
现在大约 kapt
。这很简单。如果你想在 Kotlin 代码的项目中使用 Annotation Processors,只需使用 kapt
而不是 annotationProcessor
。将其视为具有 Kotlin 支持的 annotationProcessor
。
一些图书馆使用 @Annotations
不同。它们不会导致在 compile-time 中生成任何代码,但会在运行时使用注释。
那些 通常 reflection-based 库 "look through" 运行时的代码。就像当您的应用程序执行时,Retrofit 正在查看您的 interface
。
这就是为什么您通常在应用程序中包含带有 @Annotations
的库,并且这些注释打包在您的 apk 中以供运行时操作。
总结:
annotationProcessor
和 kapt
关键字,用于帮助您指定如何在项目中使用依赖项。
如果您想引入一个使用注释并生成一些代码的库,请使用 kapt
不要 "bloat" 您的 apk 中包含已经完成其工作且永远不会被再次使用的代码.
通常,库以以下两种方式之一与注释交互:
- 使用反射。 库代码可以在运行时查询注释以执行某些逻辑。这些库通常会打包为单个工件,不需要使用
kapt
或 annotationProcessor
。示例:Retrofit,它使用反射访问注释并且不包含注释处理器。
- 使用注解处理器。注解处理器是在主要编译步骤之前调用的编译器插件,可以访问注解及其周围的代码,并根据此输入执行任务.注释处理器通常出现在单独的工件中,因为它们包含运行时不需要的代码,因此不应将其打包到您的 APK 中。示例:Butterknife,它在编译期间处理注释,并带有一个单独的
butterknife-compiler
模块,其中包含注释处理器。您应该使用 butterknife-compiler
作为 kapt
或 annotationProcessor
依赖项,而不是 implementation
、api
或 compile
,因为您不需要运行时注释处理器。
要回答您的问题,没有通用的方法可以知道依赖注释的库是否带有注释处理器。您应该查看特定库的文档并按照安装说明进行操作。
我一直在Gradle中安装依赖项,我不明白为什么有时我需要使用kapt来使用生命周期和房间数据库等库来使用@Something
注解。但是在一些像 Retrofit2 和 Gson 这样的库中,我不需要使用 kapt,我可以使用诸如 @SerializedName
?
注释(例如 @Something
)基本上是代码的标签。您标记代码的一部分,以便某些 其他代码 可以找到这些标记。
这个“其他代码”通常是一个注解处理器。它会查找注释并使用标有这些注释的代码执行某些操作。例如。它可以生成新代码(如 Dagger、Butterknife 等)。
取决于您在项目中引入依赖项的方式,(取决于您使用的 keyword
- implementation
、api
、compileOnly
、runtimeOnly
、annotationProcessor
、kapt
等),您的项目将以不同方式使用依赖项。
如果您使用 annotationProcessor
,您的依赖项将不会打包到您的应用程序中,但会在您的应用程序编译期间使用。
您不想在您的应用程序中打包编译器(处理 @AnAnnotation
的代码),因为它只是用于正确准备您的应用程序代码(并且从未在您的应用程序中使用过运行)。
这样想:
If you're going on a train and you need to print a train ticket, you don't want to carry a printer with you on the train. After the printer is done printing the ticket, you take the ticket and go on the train. Printer has done its job already. You can leave it.
如果您使用 @AnAnnotation
标记某些代码,您只希望处理该注释的库完成其工作并消失。因此,特殊类型的依赖项 - annotationProcessor
.
现在大约 kapt
。这很简单。如果你想在 Kotlin 代码的项目中使用 Annotation Processors,只需使用 kapt
而不是 annotationProcessor
。将其视为具有 Kotlin 支持的 annotationProcessor
。
一些图书馆使用 @Annotations
不同。它们不会导致在 compile-time 中生成任何代码,但会在运行时使用注释。
那些 通常 reflection-based 库 "look through" 运行时的代码。就像当您的应用程序执行时,Retrofit 正在查看您的 interface
。
这就是为什么您通常在应用程序中包含带有 @Annotations
的库,并且这些注释打包在您的 apk 中以供运行时操作。
总结:
annotationProcessor
和 kapt
关键字,用于帮助您指定如何在项目中使用依赖项。
如果您想引入一个使用注释并生成一些代码的库,请使用 kapt
不要 "bloat" 您的 apk 中包含已经完成其工作且永远不会被再次使用的代码.
通常,库以以下两种方式之一与注释交互:
- 使用反射。 库代码可以在运行时查询注释以执行某些逻辑。这些库通常会打包为单个工件,不需要使用
kapt
或annotationProcessor
。示例:Retrofit,它使用反射访问注释并且不包含注释处理器。 - 使用注解处理器。注解处理器是在主要编译步骤之前调用的编译器插件,可以访问注解及其周围的代码,并根据此输入执行任务.注释处理器通常出现在单独的工件中,因为它们包含运行时不需要的代码,因此不应将其打包到您的 APK 中。示例:Butterknife,它在编译期间处理注释,并带有一个单独的
butterknife-compiler
模块,其中包含注释处理器。您应该使用butterknife-compiler
作为kapt
或annotationProcessor
依赖项,而不是implementation
、api
或compile
,因为您不需要运行时注释处理器。
要回答您的问题,没有通用的方法可以知道依赖注释的库是否带有注释处理器。您应该查看特定库的文档并按照安装说明进行操作。