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

时间:2016-06-29 05:31:12

标签: java android android-gradle annotation-processing gradle-plugin

我正在构建一个需要一些注释处理来生成代码的库。我现在遇到一个问题,即发布版本不需要拥有与调试版本一样多的代码(因为这是一个用于修改配置变量的库 - 主要用于测试目的)。以下代码说明了这些情况。让我们说我想从一些带注释的类和属性创建一个类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插件来检查编译时的构建风格并调用不同的处理器/或以某种方式将参数传递给处理器以生成不同的代码。然而,这个话题对我来说很新,所以我不知道如何实现这一目标。几个小时的谷歌搜索也没有帮助。所以我想知道是否有人可以给我一个指示或示例?感谢

1 个答案:

答案 0 :(得分:1)

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

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

  

<强> -Akey [=值]   指定传递给注释处理器的选项。这些选项不是由javac直接解释,而是可供各个处理器使用。键值应该是由点(。)分隔的一个或多个标识符。

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

  

返回此处理器识别的选项。处理工具的实现必须提供一种方法,以便从传递给工具本身的选项中明确地传递特定于处理器的选项,请参阅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"));
  }

有关如何在gradle构建中传递选项,请参阅Pass options to JPAAnnotationProcessor from Gradle