编辑 flavor 和路径:

目前我有:

sourceSets.whenObjectAdded {
    sourceSet ->
    def sourceData = rootProject.ext[sourceSet.name]
    sourceSet.java.srcDirs = sourceData.javaDirRelease
}

rootProject.ext是一个文件,其中所有productFlavor特定配置的定义如下:
ext{
    flavor1 = [
        javaDirRelease : ['src/pathToJavaReleaseFiles']
        javaDirDebug : ['src/pathToJavaDebugFiles']
    ]
}

在主build.gradle中,我也做:apply from: 'variants.gradle',其中包含上述ext {}对象。

sourceSet的定义如下:
sourceSets {
   flavor1{}
}

这可行,但我想添加特定于productFlavor和buildType的sourceSet,如下所示:
sourceSet.debug.java.srcDirs = 'src/pathToJavaDebugFiles'

可以为每种产品口味和每种buildType定义哪个属性,但是当我尝试动态添加它时却无法使用。

对我有用的是这个(由于这个答案How can I specify per flavor buildType sourceSets?):
sourceSets {
    flavor1{
        def flavorData = rootProject.ext['flavor1']
        release {
            java.srcDirs = flavorData.javaDirRelease
        }
        debug {
            java.srcDirs = flavorData.javaDirDebug
        }
    }
}

但是,我真的希望可以动态添加它,因此我仍然可以完整保留我的配置文件。我的构建配置非常复杂,并且没有这里描述的那么简单,因此,我不需要将源文件放入src / flavor1Debug文件夹的建议,因为该资源也可以从其他productFlavors中使用,因此这是行不通的。

最佳答案

我觉得我懂了。我首先要再次说这不是一个很好的设置,您应该真正地朝着更标准的设置迈进。

因此,对于该解决方案,为了动态读取 flavor 源,我建议将您的ext结构移动到如下所示:

ext {
    sources = [
        flavor1Debug : ['src/pathToJavaReleaseFiles']
        flavor1Release : ['src/pathToJavaDebugFiles']
    ]
}

这使您可以读取源路径并遍历project.ext.sources中的键和值。

然后,您可以按名称查找变体并添加数组中的源。
applicationVariants.all { variant ->
        def extraSources = project.ext.sources.get(variant.name)
        if (extraSources != null) {
            def extraSourceFiles = extraSources.collect { project.file(it) }
            def sourceSet = variant.sourceSets.find { it.name == variant.name }
            sourceSet.java.srcDir extraSourceFiles
            def dummyTask = project.task("register${variant.name}ExtraSourcesTask")
            variant.registerJavaGeneratingTask(dummyTask, extraSourceFiles)
        }
    }

在变体级别执行此操作的麻烦之处在于,您必须注册额外的源,因为此时的变体对象已经从源集中和产品 flavor 中收集了源。但是,我认为这可能是动态执行此操作的最小侵入方法。

10-08 08:16