Ami*_*min 10 android gradle annotation-processing
我创建了一个名为EasyPrefs的注释处理器,当我尝试在我的项目中使用它时,它显示以下警告。
请求了增量注释处理,但由于以下处理器不是增量的,因此支持被禁用:net.androidcart.easyprefs.EasyPrefsProcessor (NON_INCREMENTAL)。
我做了一些研究,但找不到任何关于如何使其增量的教程。是否需要任何 Gradle 配置,或者需要覆盖某些功能等。
要使您的注释处理器递增,您必须在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_OUTPUT,SOURCE_OUTPUT或NATIVE_HEADER_OUTPUT。任何其他参数都将禁用增量处理。
隔离限制
他们必须根据可从其 AST 获得的信息为带注释的类型做出所有决定(代码生成、验证消息)。这意味着您可以分析类型的超类、方法返回类型、注释等,甚至可以传递。但是您不能根据 RoundEnvironment 中不相关的元素做出决定。这样做将导致静默失败,因为稍后将重新编译的文件太少。如果您的处理器需要根据其他不相关元素的组合做出决定,请将其标记为“聚合”。
他们必须为每个使用 Filer API 生成的文件提供一个原始元素。如果提供了零个或多个原始元素,Gradle 将重新编译所有源文件。
聚合限制
他们只能读取
CLASS或RUNTIME保留注释如果用户传递
-parameters编译器参数,它们只能读取参数名称。
PS:对于动态,您还必须覆盖getSupportedOptions()方法来指定类别:隔离或聚合。有关更多详细信息,请参阅Gradle 文档。
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |