我正在尝试创建一个为特定变体生成源代码的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可以解析符号但是在编译期间失败了?
答案 0 :(得分:1)
我的理解是在评估期间在编译器上设置了源,因此在评估之后改变sourceSets不会影响编译。 幸运的是,对于生成的源代码,Android构建系统提供了一些方便的方法,registerJavaGeneratingTask和它的资源变量(registerResGeneratingTask)。您可以使用这些来注册生成的类文件夹,然后插件将在编译路径中包含这些文件夹。
如果这些来源不是由于任务而生成的,那么您可以创建一个虚拟任务,例如project.task("register${variant.name.capitalize()}GeneratedSources")
并将该任务注册为具有适当来源的java生成任务,它仍应有效。