按ProductFlavor和buildType

时间:2017-01-11 11:24:55

标签: android gradle android-gradle android-productflavors android-build-type

编辑风味和路径:

目前我有:

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']
    ]
}

在main build.gradle中,我也这样做:apply from: 'variants.gradle',其中包含上面的\ text {}对象。

sourceSets定义如下:

sourceSets {
   flavor1{}
}

这有效,但我想添加一个特定于productFlavor的sourceSet和buildType,如下所示:

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使用的,所以这不起作用。

1 个答案:

答案 0 :(得分:2)

我想我明白了。我首先要说的是,这不是一个很好的设置,你应该真正寻求更标准的设置。

因此,对于解决方案,为了动态读取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)
        }
    }

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