7

我想知道是否可以为特定风味组组合提供文件或配置设置。例如,我有 2 个风味组,每个组有 2 种不同的风味:

风味组:版本

  • v2
  • v3

风味组:类型

  • 自由的
  • 满的

当订购“类型”、“版本”时,我可以构建 4 种不同风格的应用程序:

  • 免费V2
  • 自由V3
  • 全V2
  • 全V3

我的源代码树如下所示:

/src
    /free
        /res
    /full
        /res
    /v2
        /java
        /res
        AndroidManifest.xml (features and permissions for v2 flavors)
    /v3
        /java
        /res
        AndroidManifest.xml (features and permissions for v3 flavors)

这正是我想要的,并且非常适合我的项目。但是,我希望我可以为特定的风味组组合提供文件。例如,我想为 FullV3 和 FullV2 提供不同的 AndroidManifest。我认为这是不可能的,或者?例如:

/src
    /free
        /res
    /full
        /res
    /v2
        /java
        /res
        AndroidManifest.xml (features and permissions for v2 flavors)
    /v3
        /java
        /res
        AndroidManifest.xml (features and permissions for v3 flavors)
    /fullv3
        AndroidManifest.xml (features and permissions for full v3 only!)
    /fullv2
        AndroidManifest.xml (features and permissions for full v2 only!)

我也很高兴能够在 gradle 构建文件中执行此操作:

productFlavors {
    free {
        packageName ...
        flavorGroup "type"
    }
    full {
        packageName ...
        flavorGroup "type"
    }
    v2 {
        packageName ...
        flavorGroup "version"
    }
    v3 {
        packageName ...
        flavorGroup "version"
    }
    fullv2 {
        ...  <-- specifically for the full-v2 combination
    }
    fullv3 {
        ...  <-- specifically for the full-v3 combination
    }
}

注意:一种解决方案是只有 1 个风味组并明确定义 4 种风味:

  • 免费V2
  • 免费V3
  • 全V2
  • 全V3

但是,这对我来说不是一个可行的解决方案,因为我必须为每个版本的免费和完整风格复制所有特定于版本的代码。

4

4 回答 4

10

此功能是在Gradle的Android 插件0.7.0版中添加的

http://tools.android.com/tech-docs/new-build-system <--截至 2014 年 1 月 6 日,此链接有效

如果您有风味,您现在可以拥有一个特定于变体的源文件夹。

  • 仅适用于应用程序(不是库或测试)。名字是src/flavorDebug/...src/flavor1Flavor2Debug/
    • 注意驼峰命名,第一个字母小写。
  • 它的组件(res、manifest 等)比构建类型或风格的组件具有更高的优先级。
  • 当使用多个风味维度时,还有一个“风味组合”源文件夹可用。例如src/flavor1Flavor2/
    • 请注意,这适用于所有维度的所有组合。
    • 它的优先级高于单一风格的源集,但低于构建类型。

2014 年 1 月 30 日更新

IntelliJ IDEA v13.0.2 (Build 133.696) 现在支持在 0.7.0 中进行的 Android Gradle 插件更改

于 2014-01-06T18:05:55.773 回答
0

当口味融合在一起时,文件将被合并。因此,如果您有 infull和 in的清单v3,它们将在fullV3生成时合并。这样您就可以获得生成的组合。

于 2014-01-04T10:39:34.720 回答
0

根据提出的问题,您需要不同的 AndroidManifest 文件用于 v2 和 v3 的完整版。因此,您可以根据自己的方便使用风味和 buildTypes 的组合,而不是完全免费地使用风味。

例如

我知道完整和免费应该是产品风格而不是构建类型,但您的要求说完整和免费是您的 buildTypes,而 v2 和 v3 是您的应用风格

buildTypes {

  debug {
     runProguard false
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

  }

  full{
     runProguard false/true
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
     signingConfig signingConfigs.prodSigning // write your signingConfig

   }

  free{
     runProguard false/true
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
     signingConfig signingConfigs.prodSigning // write your signingConfig

    }
 }

 productFlavors{

   v2 {
     //required configuration for full version

   }

   v3 {
      //required configuration for full version

    }

  } 

现在您的项目结构应该如下所示。

  --src
    ---main
      ----java
      ----res
      ----Manifest
    ---full
      ----java
      ----res
      ----Manifest(Manifest you want for Full Version)
    ---free
      ----java
      ----res
      ----Manifest (Manifest you want for Free Version)
    ---v2
      ----java
      ----res
      ----Manifest
    ---v3
      ----java
      ----res
      ----Manifest

在与 Gradle 同步之后,这将在 AS 的左窗格中的构建变体选项卡中提供构建类型的组合,并将为此创建不同的任务。

转到 Build Variant 并根据您的选择从下拉列表中生成构建。

它会给你这样的构建变体

在此处输入图像描述

于 2014-01-04T22:43:08.243 回答
0

要在构建文件中为每个风味组合设置配置,您可以使用我在这里提出的解决方案:https ://stackoverflow.com/a/26585241

然后,您可以使用和 variantFilter 迭代所有风味组合并匹配每个组合的名称(就像创建“风味组合”源文件夹时使用的名称一样,您可以在其中放置特定资源,如@abest的答案中所述):

android.variantFilter { variant ->
    def flavorString = ""
    def flavors = variant.getFlavors()
    for (int i = 0; i < flavors.size(); i++) {
        flavorString += flavors[i].name;
    }
    if(flavorString.equalsIgnoreCase("fullv2")) {
        variant.getDefaultConfig().applicationId "com.example.fullv2"
    }
于 2014-10-27T14:54:16.507 回答