Gradle 风味基于其他风味

Gradle flavor based on other flavor

一种风味是否可能基于另一种风味?

例如 build.gradle:

productFlavors {
    flavor1 {
        flavorBase "main"
    }
    flavor2 {
        flavorBase "main"
    }
    flavor3 {
        flavorBase "main"
    }
    flavor4 {
        flavorBase "flavor3"
    }
    flavor5 {
        flavorBase "flavor3"
    }
}

您可以使用风味维度对特征进行分组。例如:

flavorDimensions "color", "function", "data"
productFlavors {

    color1 {
        flavorDimension "color"
        // Something
    }
    color2 {
        flavorDimension "color"
        // Something else
    }

    functions1 {
        flavorDimension "function"
        // Something
    }  
    functions2 {
        flavorDimension "function"
        // Something else
    }

    data1 {
        flavorDimension "data"
        // Something
    }  
    data2 {
        flavorDimension "data"
        // Something else
    }    
}

然后您可以像这样使用这些维度分解您的代码: Color1Function2Data1 或 Color2Function1Data1...

我 运行 遇到了同样的问题,需要像基本风味和从中继承的两种风味。

经过几个小时的大量尝试后,我得出的最佳解决方案是:

  1. 创建您的其他口味(口味 4 和 5),与您为 1 和 2 所做的相同。
  2. 为这些创建文件夹并为通用 code/ressources 创建一个基本文件夹(例如,命名为 flavor 3;与为其他 flavor 所做的方式相同)。
  3. 现在为您的子版本定义额外的源集

    flavor4 {
        res.srcDirs = ['src/flavor3/res', 'src/flavor4/res']
        java.srcDirs = ['src/flavor3/java', 'src/flavor4/java']
        resources.srcDirs = ['src/flavor3/java', 'src/flavor4/java']
    }
    flavor5 {
        res.srcDirs = ['src/flavor3/res', 'src/flavor5/res']
        java.srcDirs = ['src/flavor3/java', 'src/flavor5/java']
        resources.srcDirs = ['src/flavor3/java', 'src/flavor5/java']
    }
    

因此,在 flavor3(从这个意义上讲,这不是一种风格,但我保留原样命名)中,您可以定义通用代码和资源。 唯一的缺点是,它不可能在基本文件夹和子文件夹中具有相同的 class。