如何使我自己的注释处理器增量?

Ami*_*min 10 android gradle annotation-processing

我创建了一个名为EasyPrefs的注释处理器,当我尝试在我的项目中使用它时,它显示以下警告。

请求了增量注释处理,但由于以下处理器不是增量的,因此支持被禁用:net.androidcart.easyprefs.EasyPrefsProcessor (NON_INCREMENTAL)。

我做了一些研究,但找不到任何关于如何使其增量的教程。是否需要任何 Gradle 配置,或者需要覆盖某些功能等。

Fla*_*ade 7

要使您的注释处理器递增,您必须在incremental.annotation.processors文件中的 META-INF 中声明它:

your.fully.qualified.annotation.processor.name,category
Run Code Online (Sandbox Code Playgroud)

有三类注释处理器可供选择:动态、隔离和聚合。

基本上在一个高级别的:

  • 动态:当你的处理器只能在运行时决定它是否是增量的
  • 隔离:当您的处理器将单独处理用您的注释进行注释的每种类型时(一个输入用于一个或多个输出)
  • 聚合:当您的处理器需要聚合多个输入(用您的注释进行注释的类型)以生成一个或多个输出时

但是,每个类别都有您必须考虑的限制:

动态限制

  • 他们必须使用 Filer API 生成他们的文件。以任何其他方式写入文件将导致稍后的静默失败,因为这些文件不会被正确清理。如果您的处理器这样做,则它不能是增量的。

  • 它们不得依赖于特定于编译器的 API,例如com.sun.source.util.Trees. Gradle 包装了处理 API,因此尝试转换为特定于编译器的类型将失败。如果你的处理器这样做,它就不能是增量的,除非你有一些回退机制。

  • 如果他们使用文件管理器#createResource,该location参数必须是从StandardLocation中这些值之一:CLASS_OUTPUTSOURCE_OUTPUTNATIVE_HEADER_OUTPUT。任何其他参数都将禁用增量处理。

隔离限制

  • 他们必须根据可从其 AST 获得的信息为带注释的类型做出所有决定(代码生成、验证消息)。这意味着您可以分析类型的超类、方法返回类型、注释等,甚至可以传递。但是您不能根据 RoundEnvironment 中不相关的元素做出决定。这样做将导致静默失败,因为稍后将重新编译的文件太少。如果您的处理器需要根据其他不相关元素的组合做出决定,请将其标记为“聚合”。

  • 他们必须为每个使用 Filer API 生成的文件提供一个原始元素。如果提供了零个或多个原始元素,Gradle 将重新编译所有源文件。

聚合限制

  • 他们只能读取CLASSRUNTIME保留注释

  • 如果用户传递-parameters编译器参数,它们只能读取参数名称。

来自Gradle 文档

PS:对于动态,您还必须覆盖getSupportedOptions()方法来指定类别:隔离或聚合。有关更多详细信息,请参阅Gradle 文档