【问题标题】:Config for specific gradle flavor combination针对特定 gradle 风味组合的配置
【发布时间】:2013-10-24 09:29:19
【问题描述】:

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

风味组:版本

  • v2
  • v3

风味组:类型

  • 免费
  • 已满

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

  • 免费V2
  • FreeV3
  • 完整版2
  • 完整版3

我的源代码树如下所示:

/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
  • freeV3
  • fullV2
  • fullV3

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

【问题讨论】:

    标签: android gradle android-studio android-gradle-plugin


    【解决方案1】:

    此功能是在Android plugin for Gradle0.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(内部版本 133.696)现在支持在 0.7.0 中进行的 Android Gradle 插件更改

    【讨论】:

    • 根据问题的后半部分,您是否也知道在构建文件中执行特定风味组合的语法?
    • "请注意,这适用于所有维度的所有组合。"是否有可能使它不用于所有维度的组合,而只是其中一些维度的组合?
    【解决方案2】:

    当各种口味融合在一起时,文件将被合并。因此,如果您在fullv3 中有一个清单,它们将在生成fullV3 时合并。这样您就可以生成组合。

    【讨论】:

      【解决方案3】:

      根据问题,您需要不同的 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 并根据您的选择从下拉列表中生成构建。

      它会给你这样的构建变体

      【讨论】:

        【解决方案4】:

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

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

        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"
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-20
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          • 2019-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多