繁体   English   中英

我什么时候需要在 Gradle 依赖项中使用 Kapt?

[英]When do I need to use Kapt in Gradle dependencies?

我一直在 Gradle 中安装依赖项,但我不明白为什么有时我需要将 kapt 用于生命周期和房间数据库等库以使用@Something注释。 但是在像 Retrofit2 和 Gson 这样的一些库中,我不需要使用 kapt 并且我可以使用诸如@SerializedName注释?

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

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


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

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

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

可以这样想:

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

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

现在关于kapt 这很简单。 如果您想在带有 Kotlin 代码的项目中使用 Annotation Processors,只需使用kapt而不是annotationProcessor 将其视为具有 Kotlin 支持的annotationProcessor


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

这些通常是基于反射的库,它们在运行时“查看”代码。 就像 Retrofit 在您的应用程序执行时查看您的interface

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


总结:

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

如果你想引入一个使用注解并生成一些代码的库,请使用kapt不要用已经完成其工作的代码“膨胀”你的 apk,并且永远不会再次使用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM