管理多种口味......呈指数增长?

时间:2016-01-27 09:17:46

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

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

在我完美的世界中,它只有7种口味:

  • 使用广告
  • 没有广告
  • 使用CustomJarSDK
  • 没有CustomJarSDK
  • 适用于GooglePlay
  • 适用于AmazonStore
  • 适用于SamsungApps

在我完美的世界里,有一种方法可以将风味结合在一起,例如:

  • 使用Ads + SamsungApps + CustomJarSDK
  • 没有广告+ GooglePlay
  • 等等...

这可能吗?或者你被诅咒和被诅咒以拥有所有这些口味... ?????

  • 适用于带广告的GooglePlay
  • 适用于包含广告和CustomJarSDK的GooglePlay
  • 适用于没有广告的Google Play
  • 对于没有广告和使用CustomJarSDK的GooglePlay
  • 适用于包含广告的AmazonStore
  • 适用于包含广告和CustomJarSDK的AmazonStore
  • 适用于没有广告的AmazonStore
  • 适用于没有广告且使用CustomJarSDK的AmazonStore
  • 适用于带广告的SamsungApps
  • 适用于包含广告和CustomJarSDK的SamsungApps
  • 对于没有广告的SamsungApps
  • 对于没有广告和CustomJarSDK的SamsungApps

1 个答案:

答案 0 :(得分:1)

回答你的问题非常困难。这取决于哪种资源在任何风格上都不同。

目前您无法扩展风格或合并它们。

但是,您可以使用一些提示来改善您的项目。

例如,您可以将常见的源集资源用于不同的版本。

类似的东西:

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

然后你可以像这样定义somenthing:

 sourceSets {            
        flavor1.java.srcDir 'src/common/java'
        flavor2.java.srcDir 'src/common/java'
        flavor3.java.srcDir 'src/common/java'
    }

在你的情况下,你应该评估口味:

  • 适用于带广告的GooglePlay
  • 适用于包含广告和CustomJarSDK的GooglePlay
  • 适用于没有广告的Google Play
  • 对于没有广告和使用CustomJarSDK的GooglePlay

可以使用公共块:

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

每种风味可以使用另一种风味中定义的相同信号源 像这样的Somenthing:

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