【问题标题】:Folder naming convention for gradle build variantsgradle 构建变体的文件夹命名约定
【发布时间】:2013-10-28 21:31:59
【问题描述】:

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

我定义了这些构建类型:

  • 调试
  • 发布

还有这些口味:

  • 免费
  • 付费

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

【问题讨论】:

    标签: android gradle directory


    【解决方案1】:

    我一直在努力解决同样的问题。起初我在源代码控制中使用了两个分支,但让它们保持同步是一件很头疼的事情。 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
           ...  
    

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

    默认覆盖规则将使用“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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果你只想改变一个图标而不复制整个资源树?
      • src/main/res 适用于所有构建,因此您只需将构建变体之间不同的资源添加到构建变体特定文件夹
      • 好的,谢谢!但是,当我将一个项目从 Eclipse 转换为 Studio 时,例如,我没有得到 src/main/java,只是正常的 src。例如对于 sourceSets,我必须有一个 main(我猜它是默认的)。不知道如何处理...
      【解决方案3】:

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

      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 已从主文件夹中删除,以便它可以存在于每个构建变体中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2019-03-20
        • 1970-01-01
        相关资源
        最近更新 更多