配置特定的gradle风味组合

时间:2013-10-24 09:29:20

标签: android gradle android-studio android-gradle

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

风味组:版本

  • V2
  • V3

风味组:输入

  • 自由

当订购“Type”,“Version”时,我能够构建4种不同风格的应用程序:

  • FreeV2
  • FreeV3
  • FullV2
  • FullV3

我的源代码树看起来像这样:

/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提供不同的AndroidManifests。我不认为这是可能的,或者?例如:

/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种风味:

  • freeV2
  • freeV3
  • fullV2
  • fullV3

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

4 个答案:

答案 0 :(得分:9)

此功能已在Android plugin for Gradle

的版本 0.7.0 中添加

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

  

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

     
      
  • 仅适用于app(不是库或测试)。名称为src/flavorDebug/...src/flavor1Flavor2Debug/   
        
    • 请注意camelcase命名,首字母为小写。
    •   
  •   
  • 其组件(res,manifest等)的优先级高于构建类型或flavor的组件。
  •   
  • 当使用多个风味维度时,还有一个“风味组合”源文件夹。例如src/flavor1Flavor2/   
        
    • 请注意,这适用于所有尺寸的所有组合。
    •   
    • 它的优先级高于单味源集,但低于构建类型。
    •   
  •   

2014年1月30日更新

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

答案 1 :(得分:0)

当风味融合在一起时,文件将被合并。因此,如果您在fullv3中有清单,则会在生成fullV3时将其合并。这样就可以生成组合。

答案 2 :(得分:0)

根据问题,您需要不同的AndroidManifest文件,以获得v2和v3的完整版本。因此,您可以根据自己的方便使用flavor和buildType的组合,而不是使用完整和免费的口味。

例如

我知道完整且免费应该是产品风格而不是构建类型但是你的要求说完全和免费是你的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并根据您的选择从下拉列表生成构建。

它会为你提供像这样的Build Variants

enter image description here

答案 3 :(得分:0)

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

然后,您可以使用和variantFilter迭代所有风味组合并匹配每个组合的名称(就像创建&#34时使用的名称;风味组合&#34;源文件夹,您可以在其中放置特定资源,如上所述在@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"
    }