【问题标题】:gradle: Android Studio inherit buildtypegradle:Android Studio 继承 buildtype
【发布时间】:2014-06-26 21:39:56
【问题描述】:

我在 gradle (Android Studio) 中有 4 种构建类型

android {
  buildTypes {
     release { ... }
     debug { ... }
     kindle { ... }
     kindle_debug { ... }
  }
}

我知道,我的src 文件夹可以为每种构建类型拥有一个文件夹。所以它最终变成了

 src/
  -- debug
  -- kindle
  -- kindle_debug
  -- main // used for every project
  -- release

目前kindle 与release 相同,kindle_debug 与debug 相同。

如何避免复制 src 文件夹?有没有办法从release 和debug 继承或者让我自己在build.gradle 文件中设置src 文件夹?

编辑:一种似乎可行的解决方案是设置符号链接,但我想使用 Mac OS 和 Windows OS,并不是每个新用户都想自己设置符号链接。

编辑 2:我现在使用产品风格,正因为如此,我可以调试/发布,并使用谷歌、亚马逊和三星。这对我来说是最好的解决方案。

【问题讨论】:

    标签: android gradle android-gradle-plugin


    【解决方案1】:

    您可以从以下构建类型继承:

    buildTypes {
         release { ... }
         debug { ... }
    
         kindle {
             initWith buildTypes.release
             ...
         }
         kindle_debug {
             initWith buildTypes.debug
             ...
         }
      }
    

    【讨论】:

    • 我测试了第二次。它不使用我的release/debug 文件夹。似乎只使用了release/debug中单独定义的设置,而不是默认值。
    • 如果您需要继承签名配置(在我的情况下是从调试构建类型),它确实有效。
    • 作为未来的注释,似乎initWith 仅在您在配置文件中声明上述其他构建类型时才有效。 (即在kindle上方发布)
    • 其实正确的做法是initWith debug,你们可以在这里阅读更多developer.android.com/studio/build/build-variants#build-types,使用initWith buildTypes.debug编译失败
    【解决方案2】:

    如果我理解正确,您希望调试和发布版本之间只有几个文件不同吗?在这种情况下,以下应该可以工作(我的用例和你的一样):

    https://stackoverflow.com/a/28279105/1041533

    为了完整起见,我将在此处粘贴上述答案的相关部分:

    1. 基于资源目录的方法

    目的是根据它是发布版本还是调试版本来修改每个客户的 xml 文件夹中的文件。这可以通过相应的文件夹结构来实现。根据最初的问题,我们有 3 个客户,每个客户都有一个调试版本和一个发布版本。上述 xml 文件对于每个客户和构建类型都不同。因此有以下目录结构:

    src/
      - customerA
        //Contains all relevant resource files specific to customer A
      - customerB
        //Contains all relevant resource files specific to customer B
      - customerC
        //Contains all relevant resource files specific to customer C
    
      - customerADebug
        //Contains debug server-settings file for customer A
      - customerBDebug
        //Contains debug server-settings file for customer B
      - customerCDebug
        //Contains debug server-settings file for customer C
      - customerARelease
        //Contains release server-settings file for customer A
      - customerBRelease
        //Contains release server-settings file for customer B
      - customerCRelease
        //Contains release server-settings file for customer C
    

    因此,每个产品风味的主要内容都在与风味同名的文件夹中(customerA、customerB 等,请参见上面 sn-p 的第一部分)。现在这个文件,根据每个客户是调试版本还是发布版本而有所不同,被放入适当的文件夹中,例如 customerADebug --> 包含带有调试模式的服务器设置等的文件。

    例如,当您构建 customerA 时,如果您构建调试或发布构建,则会选择正确的文件。

    如果我需要进一步澄清这一点,请告诉我。

    【讨论】:

      【解决方案3】:

      答案可能有点晚,但我遇到了类似的问题,并通过执行以下操作设法解决了这个问题:

      android {
          sourceSets {
              kindle {
                  java.srcDirs = ["src/release/java", "src/main/java"]
              }
              kindle_debug {
                  java.srcDirs = ["src/debug/java", "src/main/java"]
              }
          }
      }
      

      如果你把它添加到你的 build.gradle 文件中,kindle 构建类型将只使用来自 release 和 main 文件夹的 java 文件,而 kindle_debug 构建类型将使用 debug 和 release 文件夹。

      当然你可以添加 kindle 文件夹或者 kindle_debug 文件夹:

      java.srcDirs = ["src/kindle/java", "src/release/java", "src/main/java"]
      java.srcDirs = ["src/kindle_debug/java", "src/debug/java", "src/main/java"]
      

      但您可能会遇到重复的类错误。

      【讨论】:

      • 你看到我的第二次编辑了吗?我现在使用产品风味而不是构建类型。此更改非常适合我的需求。
      猜你喜欢
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2016-04-14
      相关资源
      最近更新 更多