13

我一直在努力使用 gradle 和 build 变体。

我定义了这些构建类型:

  • 调试
  • 发布

还有这些口味:

  • 自由的
  • 有薪酬的

我如何为某个构建变体定义独特的资源和资产,即。免费调试?例如,我想要四个不同的应用程序名称,具体取决于构建变体,以及每个变体的不同图标。

4

3 回答 3

12

我一直在努力解决同样的问题。起初我在源代码控制中使用了两个分支,但让它们保持同步是一件很头疼的事情。Gradle 是一个非常灵活的构建系统,但默认约定并不总是足够的。这是我最终在我的代码库中解决它的方法。

我最终得到了以下目录结构(简化):

+ src
  + main
  | + res
  | | + values
  | |   - strings.xml
  | + java
  |    ...  
  + debug
  | + free
  | | + res
  | |   + values
  | |     - strings.xml
  | + paid
  |   + res
  |    + values
  |      - strings.xml
  + free
  | + res
  | | + values
  | |   - strings.xml
  | + java
  |    ...  
  + paid
    + res
    | + values
    |   - strings.xml
    + java
       ...  

在主文件夹中,我保留了两种口味共有的所有内容。在免费文件夹中,我保留了免费版本独有的所有内容(付费版本相同)。风味文件夹中的文件将覆盖在 main.js 之上。

默认覆盖规则将通过使用“src”下具有相同名称的文件夹来处理“免费”和“付费”产品风格。对我来说,问题始于构建类型的叠加。

如果我创建了一个与风味文件夹具有相同结构的调试文件夹,它将覆盖在当前使用的风味文件夹之上。这导致两种风格的调试名称相同,但我想要不同的调试名称,具体取决于风格。经过一些研究,我对我的构建文件进行了以下修改。

...

android {
    buildTypes {
        debug {
            ...
        }
        release {
            ...
        }
    }

    productFlavors {
        free {}
        paid {}
    }
}

android.applicationVariants.all { variant ->
    if (variant.buildType.name == "release") {
        ...
    }
    else if (variant.buildType.name == "debug") {
        switch (variant.name) {
            case "FreeDebug":
                variant.mergeResources.doFirst {
                    android.sourceSets.debug.setRoot("src/debug/free")
                }
                break;
            case "PaidDebug":
                variant.mergeResources.doFirst {
                    android.sourceSets.debug.setRoot("src/debug/paid")
                }
                break;
        }
    }
}

...

现在将通过首先覆盖以下文件夹来构建构建变体:

PaidRelease -> /src/main + /src/paid
PaidDebug   -> /src/main + /src/paid + /src/debug/paid

FreeRelease -> /src/main + /src/free
FreeDebug   -> /src/main + /src/free + /src/debug/free
于 2013-11-02T22:26:02.913 回答
11

根据Gradle Sourcesets and Dependencies 指南,您可以添加一个新文件夹src/freeDebug/ressrc/paidRelease/res等来为每个 Build Variant 自定义特定属性。

于 2013-10-28T21:46:03.240 回答
1

创建构建变体时的文件夹结构应该是:

app
   |
   ->src
        |
        ->buildvariantname1(as defined in gradle)
                            |
                            ->java (follow the same structure here, as in main folder)
                            ->res (follow the same structure here, as in main folder)       

现在在选择特定变体时,例如 buildVariantname1debug,将选择写入该变体下 res 文件夹中的更改。

应用程序名称应在 res->values 文件夹下的 string.xml 下定义,以便根据每个构建变体下 xml 中的值获取应用程序名称。应用程序图标也是如此。

第一张图显示了如何声明构建变体(具有不同包名称的风味)
在此处输入图像描述

第二张图显示了如果您希望每种风格都有不同的代码、可绘制对象和清单,项目结构的外观。请记住 MainActivity 已从主文件夹中删除,以便它可以存在于每个构建变体中

在此处输入图像描述

于 2017-11-03T06:25:06.257 回答