在afterEvaluate中添加构建变体源集

时间:2016-06-20 06:39:49

标签: android gradle android-gradle

我正在尝试创建一个为特定变体生成源代码的gradle插件。这些生成任务的输出目录需要添加到适当的变量源集中。

目前我在afterEvaluate区块中执行此操作(为了简单起见,包含在应用程序的build.gradle中):

android {
  ...
  productFlavors {
    foo {}
    bar {}
  }
}

afterEvaluate {
  android.sourceSets.each { sourceSet ->
    sourceSet.java.srcDirs += new File(project.buildDir, "generated/source/mygeneratedsource/${sourceSet.name}")
  }
}

我的目录结构就像这样(使用默认包来简化):

app
 \--build
     \--generated
         \--source
             \--mygeneratedsource
                 \--foo
                     \--GeneratedClass.java
                 \--bar
                     \--GeneratedClass.java
 \--src
     \--main
         \--java
             \--MyApp.java

似乎Android Studio正在将新目录作为有效的特定于变种的源目录(我可以从MyApp内部引用GeneratedClass),但如果我尝试编译,我会得到:

error: cannot find symbol GeneratedClass

有谁知道为什么AS可以解析符号但是在编译期间失败了?

1 个答案:

答案 0 :(得分:1)

我的理解是在评估期间在编译器上设置了源,因此在评估之后改变sourceSets不会影响编译。 幸运的是,对于生成的源代码,Android构建系统提供了一些方便的方法,registerJavaGeneratingTask和它的资源变量(registerResGeneratingTask)。您可以使用这些来注册生成的类文件夹,然后插件将在编译路径中包含这些文件夹。

如果这些来源不是由于任务而生成的,那么您可以创建一个虚拟任务,例如project.task("register${variant.name.capitalize()}GeneratedSources")并将该任务注册为具有适当来源的java生成任务,它仍应有效。