android - Gradle SourceSets 按 productFlavor 和 buildType

标签 android gradle android-gradle-plugin 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']
    ]
}

在主要的 build.gradle 中,我还做了:apply from: 'variants.gradle' 包含上面的 ext{} 对象。

sourceSets 是这样定义的:

sourceSets {
   flavor1{}
}

这行得通,但我想像这样添加一个特定于 productFlavor 和 buildType 的 sourceSet:

sourceSet.debug.java.srcDirs = 'src/pathToJavaDebugFiles'

可以为每个产品风格和每个构建类型定义,但是当我尝试动态添加它时这不起作用。

对我有用的是这个(感谢这个答案 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)
        }
    }

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

关于android - Gradle SourceSets 按 productFlavor 和 buildType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41589641/

相关文章:

android - 在Android中读取文件时文件不存在

android - 如何更改保存的透明位图的背景颜色

android - 评估根项目 'android'时发生问题。适用于org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler类型的对象

android - 无法解决:com.android.support:cardview-v7:26.0.0 android

android - Kotlin Dagger2 - 找不到符号 DataBindingComponent

java - Android:当url包含http时,在设置WebViewCore之前不支持removeMessages(int what = 107)

java - 如何解决 android (java) 中的退格错误

java - 使用 Kotlin 构建 Guava 依赖打破 Jar

android - 找不到 aapt2-proto.jar (com.android.tools.build :aapt2-proto:0. 3.1)

java - 如何在 Android Studio 3.0 中正确设置 Lombok