android - 管理多种口味……呈指数级增长?

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

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

在我的完美世界里应该只有 7 种口味:

  • 有广告
  • 无广告
  • 使用 CustomJarSDK
  • 没有 CustomJarSDK
  • GooglePlay
  • 对于亚马逊商店
  • 三星应用

在我的完美世界中,应该有一种方法可以在 gradle 中组合口味,例如:

  • 使用广告 + SamsungApps + CustomJarSDK
  • 无广告 + GooglePlay
  • 等等...

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

  • 对于带有广告的 GooglePlay
  • 对于带有广告和 CustomJarSDK 的 GooglePlay
  • 对于没有广告的 GooglePlay
  • 适用于没有广告且带有 CustomJarSDK 的 GooglePlay
  • 对于带有广告的 AmazonStore
  • 对于带有广告和 CustomJarSDK 的 AmazonStore
  • 对于没有广告的 AmazonStore
  • 对于没有广告和 CustomJarSDK 的 AmazonStore
  • 对于带有广告的 SamsungApps
  • 对于带有广告和 CustomJarSDK 的 SamsungApps
  • 对于没有广告的 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) block :

 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 都可以使用在另一个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']
}

关于android - 管理多种口味……呈指数级增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35033162/

相关文章:

android - Android Studio无法解决Gradle依赖关系

java - 找不到 androidsdk.modules

grails - 我应该在哪里将build.groovy文件放在我的grails项目中?

java - 将显式 Intent 更改为隐式 Intent Android

android - java.lang.SecurityException 尝试从 Android 联系人 URI 中读取

intellij-idea - 我可以使用 gradle 自动更新我的 Intellij 项目以使用最新的快照吗?

android - 库 com.google.android.gms :play-services-basement is being requested by various other libraries at [[15. 0.1,15.0.1]],但解析为 16.0.1

android - 使用 Gradle 运行所有子项目测试

java - android - 无法从 Assets 文件夹复制数据库 : API < 24

java - 如何将 textview 重置为其默认值?