我已经创建了一个名为EasyPrefs的注释处理器,当我尝试在我的项目中使用它时,它会显示以下警告。
已请求增量注释处理,但是由于以下处理器不是增量处理器,因此禁用了支持:net.androidcart.easyprefs.EasyPrefsProcessor (NON_INCREMENTAL)。
我进行了一些研究,但找不到有关如何使其逐渐增加的任何教程。是否需要任何Gradle配置,或是否需要重写某些功能,等等。
答案 0 :(得分:3)
要使注释处理器递增,必须在incremental.annotation.processors
文件的META-INF中声明它:
your.fully.qualified.annotation.processor.name,category
有三种注释处理器可供选择:动态,隔离和聚合。
基本上是高级的:
但是,每个类别都有您必须考虑的限制:
动态限制
他们必须使用Filer API生成文件。任何其他方式写入文件都会在以后导致静默失败,因为这些文件将无法正确清理。如果您的处理器执行此操作,则它不能是增量的。
它们不得依赖于特定于编译器的API,例如
com.sun.source.util.Trees
。 Gradle包装了处理API,因此尝试转换为特定于编译器的类型的尝试将失败。如果您的处理器这样做,则除非您具有某种后备机制,否则它不能是增量的。如果他们使用Filer#createResource,则
location
参数必须是StandardLocation中的以下值之一:CLASS_OUTPUT
,SOURCE_OUTPUT
或NATIVE_HEADER_OUTPUT
。其他任何参数都将禁用增量处理。
隔离限制
他们必须根据可从其AST获得的信息为带注释的类型做出所有决策(代码生成,验证消息)。这意味着您可以甚至可传递地分析类型的超类,方法返回类型,注释等。但是您不能基于RoundEnvironment中不相关的元素进行决策。这样做将导致无提示失败,因为以后将重新编译的文件太少。如果您的处理器需要基于其他不相关元素的组合来做出决策,则将其标记为“聚合”。
对于用Filer API生成的每个文件,它们必须提供恰好一个原始元素。如果提供了零个或多个原始元素,则Gradle将重新编译所有源文件。
聚合限制
他们只能读取
CLASS
或RUNTIME
保留注释仅当用户传递
-parameters
编译器参数时,它们才能读取参数名称。
PS:对于动态,还必须重写getSupportedOptions()
方法以指定类别:隔离或聚合。有关更多详细信息,请参见Gradle documentation。