Android 注释处理 - 为不同的构建风格生成不同的代码

Android annotation processing - generate different code for different build flavor

我正在构建一个需要一些注释处理才能生成代码的库。我现在 运行 遇到一个问题,即发布版本不需要像调试版本那样多的代码(因为这是一个用于修改配置变体的库 - 主要用于测试目的)。以下代码说明了这些情况。假设我想从一些带注释的 classes 和属性创建一个 class ConfigManager。在调试版本中,我需要这么多:

public class ConfigManager {
   public Class getConfigClass() {
      return abc.class;
   }
   public void method1() {
      doSomething1();
   }
   public void method2() {
      doSomething2();
   }
   public void method3() {
      doSomething3();
   }
}

在发布版本中,我只需要这么多:

public class ConfigManager {
   public Class getConfigClass() {
      return abc.class;
   }
}

我感觉可以通过编写 Gradle 插件在编译时检查构建风格并调用不同的 processor/or 以某种方式将参数传递给处理器以生成不同的代码.但是,这个主题对我来说很新,所以我不确定如何实现。几个小时的谷歌搜索也没有帮助。所以我想知道是否有人可以给我一个方向或例子?谢谢

将选项 (release=true/false) 传递给您的处理器。

来自 javac https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html

-Akey[=value] Specifies options to pass to annotation processors. These options are not interpreted by javac directly, but are made available for use by individual processors. The key value should be one or more identifiers separated by a dot (.).

结合Processor.html#getSupportedOptions https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html#getSupportedOptions

Returns the options recognized by this processor. An implementation of the processing tool must provide a way to pass processor-specific options distinctly from options passed to the tool itself, see getOptions.

实施大纲:

  public Set<String> getSupportedOptions() {
    Set<String> set = new HashSet<>();
    set.add("release");
    return set;
  }

  // -Arelease=true
  boolean isRelease(ProcessingEnvironment env) {
    return Boolean.parseBoolean(env.getOptions().get("release"));
  }

请参阅 Pass options to JPAAnnotationProcessor from Gradle 了解如何在 gradle 构建中传递选项。