想象一下这样一种情况,我需要拥有带或不带广告,带或不带CustomJarSDK以及三个市场(GooglePlay,AmazonApps和SamsungApps)的APK版本。

在我的理想世界中,只有7种 flavor :

  • 带有广告
  • (无广告)
  • 带有CustomJarSDK的
  • 不含CustomJarSDK的
  • 对于GooglePlay
  • 对于AmazonStore
  • 对于SamsungApps

  • 在我的理想世界中,应该有一种方法可以在gradle中结合各种口味,例如:

    带有广告+三星应用程序+ CustomJarSDK的
  • 不含广告+ GooglePlay的
  • 等...

  • 那可能吗?否则你会被诅咒和强制拥有所有这些味道... ?????
  • 适用于带有广告的GooglePlay
  • 适用于带有广告和CustomJarSDK的GooglePlay
  • 适用于没有广告的GooglePlay
  • 适用于无广告且使用CustomJarSDK的GooglePlay
  • 适用于带广告
  • 的AmazonStore
  • 适用于带有广告和CustomJarSDK的AmazonStore
  • 对于没有广告的AmazonStore
  • 对于没有广告且使用CustomJarSDK的AmazonStore
  • 适用于带有广告的SamsungApps
  • 适用于带有广告和CustomJarSDK的SamsungApp
  • 对于没有广告的SamsungApps
  • 适用于无广告且使用CustomJarSDK的SamsungApps
  • 最佳答案

    很难回答您的问题。这取决于哪种资源在任何口味上都不同。

    目前,您无法扩展口味或将其合并。

    但是,您可以使用一些技巧来改进您的项目。

    例如,您可以将通用源集资源用于不同的口味。

    像这样:

    + App // module
    |- src
       |- common // shared srcDir
          |- java
       + flavor1
          |- java
       + flavor2
          |- java
       + flavor3
       + flavor4
    

    然后,您可以定义如下内容:
     sourceSets {
            flavor1.java.srcDir 'src/common/java'
            flavor2.java.srcDir 'src/common/java'
            flavor3.java.srcDir 'src/common/java'
        }
    

    在您的情况下,您应该评估以下口味:
  • 适用于带有广告的GooglePlay
  • 适用于带有广告和CustomJarSDK的GooglePlay
  • 适用于没有广告的GooglePlay
  • 适用于无广告且使用CustomJarSDK的GooglePlay

  • 可以使用一个公共(public)块:
     sourceSets {
                flavor1.java.srcDir = ['src/common/java', 'src/flavor1/java']
                flavor2.java.srcDir = ['src/common/java', 'src/flavor2/java']
                flavor3.java.srcDir = ['src/common/java', 'src/flavor3/java']
            }
    

    每个 flavor 都可以使用在另一个中定义的相同源集。
    像这样的东西:
    flavor2{
            java.srcDirs = sourceSets.flavor1.java.srcDirs
            res.srcDirs = sourceSets.flavor1.res.srcDirs
            resources.srcDirs = sourceSets.flavor1.resources.srcDirs
            aidl.srcDirs = sourceSets.flavor1.aidl.srcDirs
            renderscript.srcDirs = sourceSets.flavor1.renderscript.srcDirs
            assets.srcDirs = sourceSets.flavor1.assets.srcDirs
        }
    

    同样,每种口味可以定义多个资源文件夹。例如:
    android.sourceSets {
       flavor1.res.srcDirs = ['src/main/res', src/main/res2']
    }
    

    09-04 21:53