Gradle buildType / productFlavor使用意外的buildConfigField

时间:2015-05-14 09:12:16

标签: android groovy gradle

鉴于以下配置:

productFlavors {
  normal {
    applicationId "com.app"
  }

  mock {
    applicationId "com.app.mock"
  }
}

buildTypes {
  debug {
    productFlavors.normal.buildConfigField "boolean", "mockMode", "false"
    productFlavors.mock.buildConfigField "boolean", "mockMode", "true"
  }

  release {
    productFlavors.normal.buildConfigField "boolean", "mockMode", "false"
    // Release should never point to mocks. Ever.
    productFlavors.mock.buildConfigField "boolean", "mockMode", "false"
  }
}

enter image description here

我原本期望BuildConfig.mockMode = true;,但这是生成的构建配置:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "*****";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "mock";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from product flavor: mock
  public static final boolean mockMode = false;
}

通过一些调查/调试,我意识到如果我在发行版buildType中更改产品风味的值,它实际上会更新BuildConfig.mockMode值,尽管已选择mockDebug作为我的构建变体。

我已经有了一个更好的解决方案来实现我想要做的事情,所以我只是想找一个答案,帮助我理解为什么 Gradle基于配置以这种方式行事,到帮助我更多地了解它正在做什么。

2 个答案:

答案 0 :(得分:3)

您可以提取逻辑以决定BuildConfig字段的实际值到它自己的方法中。这样,DSL配置只有一行。它看起来像这样(未经测试 - 期望语法错误):

buildTypes {
    applicationVariants.all { variant ->
        variant.buildConfigField "boolean", "mockMode", mockMode(variant)
    }
}

def mockMode(variant) {
    //Return true or false depending on variant.buildType and variant.productFlavors 
}

答案 1 :(得分:2)

使用此配置运行后,相当容易理解:

buildTypes {
    debug {
        println("debug!")
    }
    release {
        println("release!")
    }
}

您在构建日志中看到的是:

Information:Gradle tasks [:app:assembleOneDebug]
debug!
release!
:app:preBuild UP-TO-DATE
...

这意味着您的代码的所有4行都被执行,因此唯一有效的行是最后2行:

productFlavors.normal.buildConfigField "boolean", "mockMode", "false"
productFlavors.mock.buildConfigField "boolean", "mockMode", "false"

这导致您的BuildConfig

public static final boolean mockMode = false;
相关问题