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

问题描述 投票:4回答:1

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

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

我进行了一些研究,但找不到有关如何使其递增的任何教程。是否需要任何Gradle配置,或是否需要重写某些功能,等等。

android gradle annotation-processing
1个回答
0
投票

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

your.fully.qualified.annotation.processor.name,category

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

基本上是高层的:

  • dynamic:,当处理器只能在运行时决定是否递增时
  • isolation:何时处理器将使用注释单独注释的每种类型(一个输入用于一个或多个输出)
  • aggregation:当您的处理器需要聚合多个输入(带有注释的类型)以生成一个或多个输出时

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

动态限制

  • 他们必须使用Filer API生成文件。任何其他方式写入文件都会在以后导致静默故障,因为这些文件将无法正确清理。如果您的处理器执行此操作,则它不能是增量的。

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

  • 如果他们使用Filer#createResource,则location参数必须是StandardLocation中的以下值之一:CLASS_OUTPUTSOURCE_OUTPUTNATIVE_HEADER_OUTPUT。任何其他参数将禁用增量处理。

隔离限制

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

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

聚合限制

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

  • 他们仅在用户传递-parameters编译器参数时才能读取参数名称。

来自Gradle documentation

PS:对于动态,还必须重写getSupportedOptions()方法以指定类别:隔离或聚合。有关更多详细信息,请参见Gradle documentation

© www.soinside.com 2019 - 2024. All rights reserved.